【发布时间】:2019-05-07 01:01:32
【问题描述】:
我尝试获取数组的每个对象并将其与另一个数组的对象进行比较。如果它们匹配,则从第二个数组中删除该对象。
奇怪的是,如果在一个数组中两次找到一个对象,则该对象不会被过滤。
我想比较 newdata 和 existing。如果newdata 的对象具有相同的 id 和 cat,则它不会在新数组中。
existing是
var existing = [{
name: "John",
values_: {
id: 5,
cat: true
}
},
{name: "Jake",
values_: {
id: 3,
cat: true
}
},
{
name: "Alice",
values_: {
id: 2,
cat: false
}
}
];
newdata是
var newdata = [{
name: "Mike",
properties: {
id: 1,
cat: true
}
},
{name: "Jake",
properties: {
id: 3,
cat: true
}
},
{name: "Jake",
properties: {
id: 3,
cat: true
}
},
{
name: "Alice",
properties: {
id: 2,
cat: false
}
}
];
我的过滤器是
existing.forEach((existingitem, existingindex, existingfeatures) => {
newdata2 = newdata.filter(item => (
existingitem.values_.id != item.properties.id &&
existingitem.values_.cat != item.properties.cat
));
});
console.log('newdata2 - ',newdata2);
newdata2 的逻辑是只有 Mike 。问题是我可以看到Jake 两次。 Jake 不应该在那里,它已经在 existing 中。
如果我像这样编辑newdata(没有双打)
var newdata = [{
name: "Mike",
properties: {
id: 1,
cat: true
}
},
{name: "Jake",
properties: {
id: 3,
cat: true
}
} ,
{
name: "Alice",
properties: {
id: 2,
cat: false
}
}
];
我仍然可以在newdata2 中看到Jake。但为什么?
请帮我解决这个问题。是我的过滤器还是filter 的工作方式?根据标准,最后我应该只得到Mike。请指教。
谢谢
var existing = [{
name: "John",
values_: {
id: 5,
cat: true
}
},
{name: "Jake",
values_: {
id: 3,
cat: true
}
},
{
name: "Alice",
values_: {
id: 2,
cat: false
}
}
];
var newdata = [{
name: "Mike",
properties: {
id: 1,
cat: true
}
},
{name: "Jake",
properties: {
id: 3,
cat: true
}
},
{name: "Jake",
properties: {
id: 3,
cat: true
}
},
{
name: "Alice",
properties: {
id: 2,
cat: false
}
}
];
existing.forEach((existingitem, existingindex, existingfeatures) => {
newdata2 = newdata.filter(item => (
existingitem.values_.id != item.properties.id &&
existingitem.values_.cat != item.properties.cat
));
});
console.log('newdata2 - ',newdata2);
【问题讨论】:
-
...考虑基于
filter(外部)和every/some(内部)的方法,而不是forEach和filter- 也许这样更容易思考关于正确的实现。 -
问题是你总是过滤原始的
newdata数组并在每次迭代中覆盖之前的结果。因此,结果与您仅使用existing中的最后一项过滤时的结果相同。
标签: javascript arrays object filter ecmascript-6