Lau*_*n F 26 javascript arrays object key-value angularjs
我有一个对象数组,我想根据特定的key:value对减少.我想创建一个数组,每个特定key:value对只包含一个对象.将重复项的哪个对象复制到新数组并不一定重要.
例如,我想根据price属性修剪arrayWithDuplicates,创建一个只包含每个值之一的新数组:
var arrayWithDuplicates = [
{"color":"red",
"size": "small",
"custom": {
"inStock": true,
"price": 10
}
},
{"color":"green",
"size": "small",
"custom": {
"inStock": true,
"price": 30
}
},
{"color":"blue",
"size": "medium",
"custom": {
"inStock": true,
"price": 30
}
},
{"color":"red",
"size": "large",
"custom": {
"inStock": true,
"price": 20
}
}
];
Run Code Online (Sandbox Code Playgroud)
会成为:
var trimmedArray = [
{"color":"red",
"size": "small",
"custom": {
"inStock": true,
"price": 10
}
},
{"color":"green",
"size": "small",
"custom": {
"inStock": true,
"price": 30
}
},
{"color":"red",
"size": "large",
"custom": {
"inStock": true,
"price": 20
}
}
];
Run Code Online (Sandbox Code Playgroud)
是否有JavaScript或Angular函数可以循环执行此操作?
编辑:要过滤的属性嵌套在另一个属性中.
Tam*_*dus 27
function removeDuplicatesBy(keyFn, array) {
var mySet = new Set();
return array.filter(function(x) {
var key = keyFn(x), isNew = !mySet.has(key);
if (isNew) mySet.add(key);
return isNew;
});
}
Run Code Online (Sandbox Code Playgroud)
用法(EcmaScript6箭头功能使它看起来更好):
removeDuplicatesBy(x => x.custom.price, yourArrayWithDuplicates);
Run Code Online (Sandbox Code Playgroud)
编辑:编辑片段不使用属性名称,但使用键选择器功能,因此您可以达到嵌套属性.
yve*_*era 12
我不认为Angular中有内置函数,但创建一个函数并不难:
function removeDuplicates(originalArray, objKey) {
var trimmedArray = [];
var values = [];
var value;
for(var i = 0; i < originalArray.length; i++) {
value = originalArray[i][objKey];
if(values.indexOf(value) === -1) {
trimmedArray.push(originalArray[i]);
values.push(value);
}
}
return trimmedArray;
}
Run Code Online (Sandbox Code Playgroud)
用法:
removeDuplicates(arrayWithDuplicates, 'size');
Run Code Online (Sandbox Code Playgroud)
返回:
[
{
"color": "red",
"size": "small"
},
{
"color": "blue",
"size": "medium"
},
{
"color": "red",
"size": "large"
}
]
Run Code Online (Sandbox Code Playgroud)
和
removeDuplicates(arrayWithDuplicates, 'color');
Run Code Online (Sandbox Code Playgroud)
返回:
[
{
"color": "red",
"size": "small"
},
{
"color": "green",
"size": "small"
},
{
"color": "blue",
"size": "medium"
}
]
Run Code Online (Sandbox Code Playgroud)
使用Array.filter(),通过使用Object作为哈希来跟踪值,并过滤掉其值已包含在哈希中的任何项目.
function trim(arr, key) {
var values = {};
return arr.filter(function(item){
var val = item[key];
var exists = values[val];
values[val] = true;
return !exists;
});
}
Run Code Online (Sandbox Code Playgroud)
您可以为此使用下划线:
//by size:
var uSize = _.uniq(arrayWithDuplicates, function(p){ return p.size; });
//by custom.price;
var uPrice = _.uniq(arrayWithDuplicates, function(p){ return p.custom.price; });
Run Code Online (Sandbox Code Playgroud)