根据字段获取数据,该字段根据条件

时间:2016-12-08 17:35:03

标签: javascript arrays json underscore.js filtering

我有如下对象数组:

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"]); })

我发现这不是一种有效的方式,但无法找到任何其他解决方案。 请指导。

2 个答案:

答案 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");