我有以下格式的数据
var list2 = [
{
items:{
val: 'a'
}
},
{
items:[
{
val: 'b'
},
{
val: 'c'
},
]
}
];
例如,我需要检查列表是否包含val = 'b'
的项目。
如您所见,这是一个对象数组,每个对象都有items
属性,可以是单个对象,也可以是对象数组。
答案 0 :(得分:1)
对于一个简单的测试,如果至少有一个项目与我们搜索到的属性匹配,则返回true
,_.some
将起作用。
function test(arr, matches) {
return _.some(arr, obj => {
var items = obj.items;
// make non-array items an array.
return _.some(!_.isArray(items) ? [items]: items, matches);
});
}
var hasValA = test(list2, { val: 'a' });
function test(arr, matches) {
return _.some(arr, obj => {
var items = obj.items;
return _.some(!_.isArray(items) ? [items]: items, matches);
});
}
var list1 = [{
items: [{
val: 'a'
}]
}],
list2 = [{
items: {
val: 'a'
}
}, {
items: [{
val: 'b'
}, {
val: 'c'
}, ]
}],
list3 = [{
items: [{
val: 'b'
}]
}];
var matches = {
val: 'a'
};
console.log("list1:", test(list1, matches));
console.log("list2:", test(list2, matches));
console.log("list3:", test(list3, matches));

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
在
的帮助下,这也可以在普通的ES6中实现function test(arr, matches) {
return arr.some(obj => {
var items = obj.items;
if (!Array.isArray(items)) items = [items];
return items.some(obj => {
return Object.keys(matches).every(key => matches[key] === obj[key]);
});
});
}
var hasValA = test(list2, { val: 'a' });
function test(arr, matches) {
return arr.some(obj => {
var items = obj.items;
if (!Array.isArray(items)) items = [items];
return items.some(obj => {
return Object.keys(matches).every(key => matches[key] === obj[key]);
});
});
}
var list1 = [{
items: [{
val: 'a'
}]
}],
list2 = [{
items: {
val: 'a'
}
}, {
items: [{
val: 'b'
}, {
val: 'c'
}, ]
}],
list3 = [{
items: [{
val: 'b'
}]
}];
var matches = {
val: 'a'
};
console.log("list1:", test(list1, matches));
console.log("list2:", test(list2, matches));
console.log("list3:", test(list3, matches));
&#13;
这两种解决方案都适用于更复杂的对象来匹配。
test(list2, { val: 'a', other: 2, /* ... */ });
答案 1 :(得分:0)