检查数组是否包含指定的对象
Check if an array contains a specified object
以下函数通过具有嵌套数组的对象递归搜索对象:
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)
没有记录任何内容。arr.indexOf(obj)
不应该返回1,从而使第二个console.log(arr)
记录数组吗?
这是CodePen。
使用
indexOf
在数组中找不到object
的index
,除非两个对象(在indexOf
中传递以进行测试并存在于数组中)都指向同一引用。
例如:
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>
但是,
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`
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
在文档中,indexOf()
使用严格相等(与===
或三重相等运算符使用的方法相同)将searchElement与Array的元素进行比较。
{} === {}
将被评估为false
,因为
只有当操作数引用同一Object时,比较Object的表达式才为true。如果两个操作数都是对象,则JavaScript比较当操作数引用内存中的同一对象时相等的内部引用。【参考】
目前的解决方案和方法很少,但都是在对象中对key
的value
进行迭代和比较。请参阅答案
相关文章:
- 如何访问对象内部的“categoryIds”字段/键,该对象包含mongodb's `ObjectId(s)`数
- IE8对象当对象包含null值时应出现错误
- 实际的angular js控制器对象包含什么
- RXJS5 - 按每个对象包含的可观察性过滤对象数组
- 如何在Jade编译之前将Javascript对象包含在Jade模板中
- json对象包含php DateTime,如何转换为漂亮的日期字符串
- 如何使JQuery对象包含Dom对象的快照
- 如果对象包含JavaScript中的字母,如何返回该对象
- 对象包含相同的值,但应该't
- 将一个对象包含在另一个对象中
- Mocha,Chai:断言对象包含在对象数组中
- 测试JSON对象包含我期望的属性
- 如何从json对象中提取数据,json对象包含具有不同类型对象的映射
- AngularJS$http发布对象包含数组的奇怪行为
- 我如何通过另一个对象访问一个对象,这个对象包含一个对象,这个对象是我想要访问的对象的属性
- 如何切换映射-发出一个对象包含原始和新的可观察对象
- 在这种情况下,我应该使用数组(包含对象)还是对象(包含对象)
- 如果对象包含在另一个数组中,则从该数组中删除该对象
- 将JSON发送到WebAPI - JSON对象包含一个图像(字节)-得到错误:表达式太长或太复杂而无法编译
- Angular -只有当数组中的对象包含completed:true时才启用按钮