【问题标题】:How to check if array contains specific object [duplicate]如何检查数组是否包含特定对象[重复]
【发布时间】:2019-01-12 16:25:46
【问题描述】:
我正在尝试检查对象数组是否包含特定对象或具有特定属性的对象。
var mainArray = [
{name:"Yahya", age:"29"},
{name:"Ahmed", age:"19"},
{name:"Mohamed", age:"10"},
{name:"Ali", age:"32"},
{name:"Mona", age:"25"},
{name:"Shady", age:"62"},
{name:"Reem", age:"11"},
{name:"Marwa", age:"52"}
]
var myObject = {name:"Yahya", age:"29"};
function check() {
if (mainArray.indexOf(myObject) > -1) {
console.log("true")
return true;
} else {
console.log('false')
return false;
}
};
<button onClick="check()">Check</button>
然而,这里的对象与数组对象之一相同。但它返回 false 。
我试过包含,也没有工作。
【问题讨论】:
标签:
javascript
arrays
javascript-objects
indexof
【解决方案1】:
如果您想检查对象数组是否包含该特定对象,则可以使用Array.some
var mainArray = [{
name: "Yahya",
age: "29"
},
{
name: "Ahmed",
age: "19"
},
{
name: "Mohamed",
age: "10"
},
{
name: "Ali",
age: "32"
},
{
name: "Mona",
age: "25"
},
{
name: "Shady",
age: "62"
},
{
name: "Reem",
age: "11"
},
{
name: "Marwa",
age: "52"
}
]
var myObject = {
name: "Yahya",
age: "29"
};
let ans = mainArray.some(function(arrVal) {
return myObject.name === arrVal.name;
});
console.log(ans)
您也可以使用filter 方法。在这种情况下,它将返回匹配元素的数组。检查返回数组的长度以验证它是否包含所需的元素
var mainArray = [{
name: "Yahya",
age: "29"
},
{
name: "Ahmed",
age: "19"
},
{
name: "Mohamed",
age: "10"
},
{
name: "Ali",
age: "32"
},
{
name: "Mona",
age: "25"
},
{
name: "Shady",
age: "62"
},
{
name: "Reem",
age: "11"
},
{
name: "Marwa",
age: "52"
}
]
var myObject = {
name: "Yahya",
age: "29"
};
let newAns = mainArray.filter(function(item) {
return item.name === myObject.name && item.age === myObject.age
})
if (newAns.length > 0) {
console.log(true);
} else {
console.log(false)
}
【解决方案2】:
findIndex 给出了一个Array 方法,我们可以像下面这样简单地做一些事情
var mainArray = [
{name:"Yahya", age:"29"},
{name:"Ahmed", age:"19"},
{name:"Mohamed", age:"10"},
{name:"Ali", age:"32"},
{name:"Mona", age:"25"},
{name:"Shady", age:"62"},
{name:"Reem", age:"11"},
{name:"Marwa", age:"52"}
]
var myObject = {name:"Yahya", age:"29"};
function check() {
if (mainArray.findIndex(obj => obj.name == myObject.name && obj.age == myObject.age) > -1) {
console.log("true")
return true;
} else {
console.log('false')
return false;
}
};
<button onClick="check()">Check</button>
【解决方案3】:
您可以检查该数组的some 元素是否与您在字符串化时检查的对象相同,如下所示:
mainArray.some(e => JSON.stringify(e) === JSON.stringify(myObject))
function check() {
console.log(mainArray.some(e => JSON.stringify(e) === JSON.stringify(myObject)))
};
let mainArray = [{
name: "Yahya",
age: "29"
},
{
name: "Ahmed",
age: "19"
},
{
name: "Mohamed",
age: "10"
},
{
name: "Ali",
age: "32"
},
{
name: "Mona",
age: "25"
},
{
name: "Shady",
age: "62"
},
{
name: "Reem",
age: "11"
},
{
name: "Marwa",
age: "52"
}
]
let myObject = {
name: "Yahya",
age: "29"
};
<button onClick="check()">Check myObject</button>
【解决方案4】:
indexOf 将尝试使用基本比较机制在集合中查找对象。尝试运行:
{name:"Yahya", age:"29"} === {name:"Yahya", age:"29"}
在 javascript 控制台中,你会得到错误,因为它们是 2 个不同的对象,使用相同的字符串文字创建。
我认为您应该阅读更多关于 OOP 中对象的信息。
要使用 Array.prototype.some() 提供的测试器函数检查集合是否包含元素:
var mainArray = [
{name:"Yahya", age:"29"},
{name:"Ahmed", age:"19"},
{name:"Mohamed", age:"10"},
{name:"Ali", age:"32"},
{name:"Mona", age:"25"},
{name:"Shady", age:"62"},
{name:"Reem", age:"11"},
{name:"Marwa", age:"52"}
];
var myObject = {name: "Yahya", age: "29"};
function check(object) {
return mainArray.some(function(element) {
return element.name === object.name && element.age === object.age;
})
}
console.log(check(myObject));
请注意,比较是使用“===”完成的,如果您在 mainArray 集合中将年龄设置为字符串并且在 myObject - 作为数字,请改用“==”进行年龄比较。