[英]How to check if an object exists within another object using JS
假设我有一个对象数组
var arr= [{name:'John', lastName:'Smith', age:25}, {name:'Steve', lastName:'Johnson', age:56}];
var obj1 ={name:'John', lastName:'Smith'};
如何使用JS检查对象是否存在于另一个对象中?
嵌套循环会成功吗? 第一个循环遍历数组内部的对象,第二个循环遍历对象内部的键/值对并将它们与obj1键/值对进行比较。 有一个更好的方法吗 ? 还是我应该使用3个循环?
该函数应在包含obj1的arr中返回obj el。 例如:arr [0]应该返回,因为它包含obj1
function objInArr(srcArr, obj) {
var arr = [];
//var srcLength = 0;
//var sourceSize = Object.keys(source).length; // The length of the source obj
srcArr.forEach(function(el) {
el.forEach(function(objEl){
obj.forEach(function(sourceEl){
if( sourceEl === objEl) { arr.push(sourceEl); }
});
});
});
return arr;
}
您可以结合使用Arry#find()
和Array#some()
方法来遍历数组对象,并查找是否存在具有相同键和值的对象:
var exists = arr.find(function(o){
return Object.keys(o).some(function(k){
return !Object.keys(obj1).indexOf(k)>-1 || o[k]!=obj1[k];
});
});
如果存在,它将返回一个object
,如果要返回一个boolean
,则可以使用.find()
来更改.some()
。
这里的语句!Object.keys(obj1).indexOf(k)>-1 || o[k]!=obj1[k]
如果对象没有迭代key
或它的value
不相同,则!Object.keys(obj1).indexOf(k)>-1 || o[k]!=obj1[k]
将退出。
演示:
var arr= [{name:'John', lastName:'Smith', age:25}, {name:'Steve', lastName:'Johnson', age:56}]; var obj1 ={name:'John', lastName:'Smith'}; var exists = arr.find(function(o){ return Object.keys(o).some(function(k){ return !Object.keys(obj1).indexOf(k)>-1 || o[k]!=obj1[k]; }); }); console.log(exists);
// object contains subObject
function partialContains(object, subObject) {
// Create arrays of property names
const objProps = Object.getOwnPropertyNames(object);
const subProps = Object.getOwnPropertyNames(subObject);
if (subProps.length > objProps.length) {
return false;
}
for (const subProp of subProps) {
if (!object.hasOwnProperty(subProp)) {
return false;
}
if (object[subProp] !== subObject[subProp]) {
return false;
}
}
return true;
}
您现在可以像这样使用它:
const arr= [{name:'John', lastName:'Smith', age:25}, {name:'Steve', lastName:'Johnson', age:56}];
const obj1 ={name:'John', lastName:'Smith'};
const containing = arr.find((object) => partialContains(object, obj1));
如果containing
未定义,什么也没有找到,否则,包含对象obj1
返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.