检查数组是否包含指定的对象

时间:2016-04-16 11:46:56

标签: javascript arrays

以下函数通过具有嵌套数组的对象递归搜索对象:

function findDeep(arr, obj) {
  console.log(arr)
  if (arr.indexOf(obj) !== -1) {
    console.log(arr)
    return arr
  } else {
    arr.forEach(item => {
      if (item.children) findDeep(item.children, obj)
    })
  }
}

const colors = {
  children: [
    {
      name: 'white',
    },
    {
      name: 'yellow',
      children: [
        {
          name: 'black'
        }
      ]
    }
  ]
}

const color = {
  name: 'black'
}

findDeep(colors.children, color)

第一个console.log(arr)会记录匹配的数组:

[
  { name: 'black' }
]

但他第二次console.log(arr)没有记录任何东西。不应该{1}返回1,因此第二个arr.indexOf(obj)会记录数组吗?

这里是CodePen

1 个答案:

答案 0 :(得分:2)

  

使用index在数组中找不到object indexOf,除非两个对象(在indexOf中传递给test并在数组中出现)指向同一个参考

例如:



var a = {
  a: 10
};
var b = [{
  a: 10
}, {
  b: 20
}];
console.log(b.indexOf(a)); // Object `a` and Object in `0th` index of the array are having similar `key-values`

<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
&#13;
&#13;
&#13;

<强>但是,

&#13;
&#13;
var a = {
  a: 10
};
var b = [a, {
  b: 20
}];
//`0th` index in the array is nothing but a variable holding `object`
console.log(b.indexOf(a)); //Same variable is tested in `indexOf`
&#13;
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
&#13;
&#13;
&#13;

From the docsindexOf()使用严格相等(使用===或三等号运算符使用的相同方法)将searchElement与Array的元素进行比较。

{} === {}将被评估为false因为,

  

仅当操作数引用相同的Object时,才会将比较Objects的表达式设为true。如果两个操作数都是对象,则JavaScript比较内部引用,当操作数引用内存中的同一对象时,它们是相等的。[Ref]

很少有解决方案和方法,但所有这些解决方案和方法都将进行迭代并比较对象中value的{​​{1}}。请参阅此answer