以下函数通过具有嵌套数组的对象递归搜索对象:
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。
答案 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;
<强>但是,强>
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;
From the docs,indexOf()
使用严格相等(使用===
或三等号运算符使用的相同方法)将searchElement与Array的元素进行比较。
{} === {}
将被评估为false
因为,
仅当操作数引用相同的Object时,才会将比较Objects的表达式设为true。如果两个操作数都是对象,则JavaScript比较内部引用,当操作数引用内存中的同一对象时,它们是相等的。[Ref]
很少有解决方案和方法,但所有这些解决方案和方法都将进行迭代并比较对象中value
的{{1}}。请参阅此answer