我有如下对象数组:
var data = [
{ SrNo: 1, BabyName: 'A', ParentName: 'X' },
{ SrNo: 2, BabyName: 'D', ParentName: 'X' },
{ SrNo: 3, BabyName: 'B', ParentName: 'Y' },
{ SrNo: 4, BabyName: 'E', ParentName: 'Y' },
{ SrNo: 5, BabyName: 'C', ParentName: 'Z' }
]
我将输入作为BabyNames
的数组输入,我必须为它们找到ParentNames
,然后在ParentNames
上过滤数据作为输出。
input = ['A','B'];
所以,如果我的输入是['A','B']
,我的预期输出是4个对象的数组(SrNo 1,2,3,4)
我做了什么来实现
//filter all objects for matching BabyNames
var a1 = _.filter(data, function (item) { return _.contains(input, item["BabyName"]); })
//pluck ParentNames from a1 array of objects and take unique
var a2 = _.uniq(_.pluck(a1,"ParentName"))
//filter all objects (original data set) on ParentName with a2 as input
var a3 = _.filter(data, function (item) { return _.contains(a2, item["ParentName"]); })
我发现这不是一种有效的方式,但无法找到任何其他解决方案。 请指导。
答案 0 :(得分:0)
基本上你需要至少迭代2次数据数组,一个用于获取父项,一个用于过滤结果。如果使用Set
或对象作为哈希表,则可以克服中间步骤。
这是ES6中的提案。
var data = [{ SrNo: 1, BabyName: 'A', ParentName: 'X' }, { SrNo: 2, BabyName: 'D', ParentName: 'X' }, { SrNo: 3, BabyName: 'B', ParentName: 'Y' }, { SrNo: 4, BabyName: 'E', ParentName: 'Y' }, { SrNo: 5, BabyName: 'C', ParentName: 'Z' }],
input = ['A', 'B'],
babies = new Set(input),
parents = new Set,
result;
data.forEach(a => babies.has(a.BabyName) && parents.add(a.ParentName));
result = data.filter(a => parents.has(a.ParentName));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
Here is another way获得结果。
var input = ['A', 'B'];
function getParents(input, filterProp, returnProp) {
var filtered = data.filter(function(d) {
return input.indexOf(d[filterProp]) !== -1;
});
if (returnProp) {
return filtered.map(function(d) {
return d[returnProp];
});
}
return filtered;
}
// get the result by first filter with baby name and return parent names
// then filter with parent names
getParents(getParents(input, "BabyName", "ParentName"), "ParentName");