2016-12-08 2 views
2

У меня есть массив объектов, как показано ниже:Получить данные, основанные на поле, которое вычисляется при условии

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

I находят это не эффективным способом, но не могут прийти к какому-либо другому решению. Пожалуйста, руководство.

+2

Is SrNo наследует свойства объекта от имени BabyName, который наследует свойства от parentName? Не знаете, как читать приведенную выше диаграмму объекта. –

+0

_ «массив объектов, как показано ниже» _, это не массив объектов. Пожалуйста, укажите [mcve]. –

+0

Я добавил переменную входных данных – iTSrAVIE

ответ

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; }

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