ni8*_*8mr 10 javascript filter
我有一个这样的对象数组 -
var arr = [
{ type_id: "3", full_empty:"true", quantity:1},
{ type_id: "3", full_empty:"true", quantity:1},
{ type_id: "9", full_empty:"true", quantity:4},
{ type_id: "9", full_empty:"false", quantity:4},
{ type_id: "9", full_empty:"true", quantity:4},
{ type_id: "9", full_empty:"true", quantity:4},
{ type_id: "9", full_empty:"true", quantity:4}
];
Run Code Online (Sandbox Code Playgroud)
我想删除具有相同type_id和full_empty值的重复项.结果应该是这样的 -
var arr = [
{ type_id: "3", full_empty:"true", quantity:1},
{ type_id: "9", full_empty:"true", quantity:4},
{ type_id: "9", full_empty:"false", quantity:4},
];
Run Code Online (Sandbox Code Playgroud)
我已经搜索并找到了一些解决方案,但其中一些是用于删除重复键或基于仅一个键的重复值删除重复项.一些需要的外部库.还有一些我无法理解的解决方案.有没有简单的方法在纯JavaScript中执行此操作?
编辑以便更好地理解 - 我已阅读此问题.对该问题的接受答案是仅查找一个密钥的重复.在我的情况下,我必须找到多个键的重复.
Adi*_*ngh 10
您可以使用Array.some()和Array.reduce()将纯函数用于将输入数组减少为不同元素的数组,如下所示
var arr = [
{ type_id: "3", full_empty:"true", quantity:1},
{ type_id: "3", full_empty:"true", quantity:1},
{ type_id: "9", full_empty:"true", quantity:4},
{ type_id: "9", full_empty:"false", quantity:4},
{ type_id: "9", full_empty:"true", quantity:4},
{ type_id: "9", full_empty:"true", quantity:4},
{ type_id: "9", full_empty:"true", quantity:4}
];
var a = arr.reduce(function (accumulator, current) {
if (checkIfAlreadyExist(current)) {
return accumulator
} else {
return accumulator.concat([current]);
}
function checkIfAlreadyExist(currentVal) {
return accumulator.some(function(item){
return (item.type_id === currentVal.type_id &&
item.full_empty === currentVal.full_empty);
});
}
}, []);
console.log(a);
Run Code Online (Sandbox Code Playgroud)
简洁的ES6语法
reduce
可以使用ES6箭头函数和扩展运算符编写更简洁的内容,如下所示:
var arr = [
{ type_id: "3", full_empty:"true", quantity:1},
{ type_id: "3", full_empty:"true", quantity:1},
{ type_id: "9", full_empty:"true", quantity:4},
{ type_id: "9", full_empty:"false", quantity:4},
{ type_id: "9", full_empty:"true", quantity:4},
{ type_id: "9", full_empty:"true", quantity:4},
{ type_id: "9", full_empty:"true", quantity:4}
];
var a = arr.reduce((accumulator, current) => {
if (checkIfAlreadyExist(current)) {
return accumulator;
} else {
return [...accumulator, current];
}
function checkIfAlreadyExist(currentVal) {
return accumulator.some((item) => {
return (item.type_id === currentVal.type_id &&
item.full_empty === currentVal.full_empty);
});
}
}, []);
console.log(a);
Run Code Online (Sandbox Code Playgroud)
尽管有其他解决方案,我建议使用带有type_id
和full_empty
作为键的哈希表,如果找到新的,则将哈希设置为 true。与 一起Array#filter
,您将获得一个包含独特项目的新数组。
var arr = [{ type_id: "3", full_empty: "true", quantity: 1 }, { type_id: "3", full_empty: "true", quantity: 1 }, { type_id: "9", full_empty: "true", quantity: 4 }, { type_id: "9", full_empty: "false", quantity: 4 }, { type_id: "9", full_empty: "true", quantity: 4 }, { type_id: "9", full_empty: "true", quantity: 4 }, { type_id: "9", full_empty: "true", quantity: 4 }],
filtered = arr.filter(function (a) {
var key = a.type_id + '|' + a.full_empty;
if (!this[key]) {
this[key] = true;
return true;
}
}, Object.create(null));
console.log(filtered);
Run Code Online (Sandbox Code Playgroud)
ES6
var arr = [{ type_id: "3", full_empty: "true", quantity: 1 }, { type_id: "3", full_empty: "true", quantity: 1 }, { type_id: "9", full_empty: "true", quantity: 4 }, { type_id: "9", full_empty: "false", quantity: 4 }, { type_id: "9", full_empty: "true", quantity: 4 }, { type_id: "9", full_empty: "true", quantity: 4 }, { type_id: "9", full_empty: "true", quantity: 4 }],
filtered = arr.filter(
(temp => a =>
(k => !temp[k] && (temp[k] = true))(a.type_id + '|' + a.full_empty)
)(Object.create(null))
);
console.log(filtered);
Run Code Online (Sandbox Code Playgroud)