javascript - JavaScript 对象数组:删除具有重复属性的对象。相同的条件有不同的输出
问题描述
如果年龄属性使用以下代码匹配,我正在尝试从数组中删除一个对象。
var state= [
{name: "Nityanand", age:23},
{name: "Mohit", age:25},
{name: "Nityanand", age:25}
]
let a= [...state];
var ids=[]
var ar = a.filter(function(o) {
if (ids.indexOf(o.age) !== -1){
return false;
}
else if(ids.indexOf(o.age) === -1){
ids.push(o);
return true;}
})
console.log(ids)
// OUTPUT: (NOT working fine)
{name: "Nityanand", age:23},
{name: "Mohit", age:25},
{name: "Nityanand", age:25}
但是,如果我只通过在数组中推送一个属性来编辑代码,它就可以正常工作:
var state= [
{name: "Nityanand", age:23},
{name: "Mohit", age:25},
{name: "Nityanand", age:25}
]
let a= [...state];
var ids=[]
var ar = a.filter(function(o) {
if (ids.indexOf(o.age) !== -1){
return false;
}
else if(ids.indexOf(o.age) === -1){
ids.push(o.age); // Here i have edited the code by pushing only age property to the array
return true;}
})
console.log(ids)
OUTPUT : [23, 25] // Only two items were added.
条件没有区别,但在第一个代码的输出中,在空数组中添加了 3 个项目,而在第二个代码中,只有 2 个项目被添加。这怎么可能?
解决方案
在您的第一个示例中,您将整个对象放入数组ids
中,但如果年龄存在,则尝试匹配indexOf
- 那将不起作用。您永远不会找到具有age
匹配属性的对象。您可以使用findIndex
var state = [{
name: "Nityanand",
age: 23
},
{
name: "Mohit",
age: 25
},
{
name: "Nityanand",
age: 25
}
]
let a = [...state];
var ids = []
var ar = a.filter(function(o) {
const idx = ids.findIndex(id => id.age == o.age);
if (idx !== -1) {
return false;
} else if (idx === -1) {
ids.push(o);
return true;
}
})
console.log(ids)
推荐阅读
- php - 应用于大型数组时,PHP Foreach 循环太慢
- python - 如何在 Python 中将 000-000 更改为 000000?
- python - python/numpy一次组合4行子数组
- html - Nunjucks 嵌套变量
- bitbucket - 配置 bitbucket 插件以避免对安全变量进行硬编码
- r - 嵌套狄利克雷过程的演示代码
- mysql - 在“Where”子句中组合两个子查询的好选择
- clojure - Leiningen:无法使用“不安全”的代理存储库
- javascript - selenium javascript textarea值错误
- c++ - Changing source file extension from .m to .mm failing in Xcode 9.3 for Screen Saver project