繁体   English   中英

如何使用JS检查对象是否存在于另一个对象中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM