我有一个对象数组,需要检查该数组中是否已存在类似的对象。 例如,是否有一个具有相同品牌和型号属性的对象(福特福克斯):
{
make: 'Ford',
model: 'Focus',
color: 'red',
year: 2016
}
在这个数组中吗?
[
{
make: 'Ford',
model: 'Focus',
color: 'blue',
year: 2008
},
{
make: 'Ford',
model: 'Mustang',
color: 'red',
year: 2011
},
{
make: 'Chevy',
model: 'Malibu',
color: 'blue',
year: 2012
},
{
make: 'Ford',
model: 'Focus',
color: 'black',
year: 1999
}
]
我更喜欢ES6方法,但也可以使用lodash。 Lodash具有_.some,但据我所知,它与整个对象(不仅是所需的特定属性)匹配,或者仅与一个属性匹配。另外,我需要_.pullAllWith之类的东西,在其中可以删除包含那些特定属性的所有对象(即删除所有包含Ford Focuses的对象)。
答案 0 :(得分:1)
创建一个函数并使用every
和function exists(arr, obj, ...keys) {
return arr.some(e => keys.every(k => e[k] && obj[k] && e[k] === obj[k]));
}
console.log(exists(arr, check, 'make', 'model'));
,下面的方法适用于您传入的任何键。
<script>
let arr = [
{
make: 'Ford',
model: 'Focus',
color: 'blue',
year: 2008
},
{
make: 'Ford',
model: 'Mustang',
color: 'red',
year: 2011
},
{
make: 'Chevy',
model: 'Malibu',
color: 'blue',
year: 2012
},
{
make: 'Ford',
model: 'Focus',
color: 'black',
year: 1999
}
]
let check = {
make: 'Ford',
model: 'Focus',
color: 'red',
year: 2016
};
</script>
\b
答案 1 :(得分:1)
var cars = [
{
make: 'Ford',
model: 'Focus',
color: 'blue',
year: 2008
}, {
make: 'Ford',
model: 'Mustang',
color: 'red',
year: 2011
}, {
make: 'Chevy',
model: 'Malibu',
color: 'blue',
year: 2012
}, {
make: 'Ford',
model: 'Focus',
color: 'black',
year: 1999
}
];
使用some(),您可以发现数组中的某些元素是否包含该属性:
const containsFordFocus = cars.some( car => car.make === 'Ford' && car.model === 'Focus');
console.log(containsFordFocus); // true
使用过滤器,您可以排除一些元素:
const filteredArray = cars.filter( car => car.make !== 'Ford' && car.model !== 'Focus');
console.log(filteredArray); // [ { make: 'Chevy', model: 'Malibu', color: 'blue', year: 2012 } ]