Поднабор литерала объекта javascript путем сопоставления массива значений - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужно подставить в литерал объекта myData те элементы, которые принадлежат group B и с year, совпадающими с найденными в group A:

var myData = [{"year":1,"group":"A","value":0.1},
 {"year":2,"group":"A","value":0.2},
 {"year":3,"group":"A","value":0.2},
 {"year":4,"group":"A","value":0.1},
 {"year":5,"group":"A","value":0.1},
 {"year":1,"group":"B","value":0.1},
 {"year":2,"group":"B","value":0.2},
 {"year":3,"group":"B","value":0.2},
 {"year":4,"group":"B","value":0.2},
 {"year":5,"group":"B","value":0.9},
 {"year":6,"group":"B","value":0.1}] ;

Я могу использовать .filter(), чтобы получить желаемый результат:

mySubset = myData.filter((d) => {return d.group == "B" && d.year < 6;});

в результате:

[{"year":1,"group":"B","value":0.1},
  {"year":2,"group":"B","value":0.2},
  {"year":3,"group":"B","value":0.2},
  {"year":4,"group":"B","value":0.2},
  {"year":5,"group":"B","value":0.9}];

Но это не идеально. Я хочу универсальное универсальное решение, которое не зависит от «ручного» ввода максимального значения (6). Кроме того, year может не быть последовательностью (например, [2, 1, 4, 5]).

По сути, препятствие находится во второй части условия (d.year < 6). Мне нужно что-то, что соответствует значениям, найденным в:

let x = []

for(i = 0; i < myData.filter((d) => {return d.group == "A";}).length; i++){
    x.push(myData[i].year);
}

Спасибо!

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Ты на полпути; теперь, когда у вас есть массив всех лет в группе «A», вам просто нужно проверить, находится ли год в группе «B» в этом массиве. Вы можете использовать .includes() для этого.

mySubset = myData.filter((d) => {return d.group == "B" && x.includes(d.year);});
0 голосов
/ 05 сентября 2018

С помощью функции getSubset() вы можете передать желаемую группу и год в качестве аргументов (спасибо @mhodges)

Я также отфильтровываю любые потенциально пустые массивы внутри вашего массива yearGroups, если год не совпадает ни с чем

let myData = [
 {"year":1,"group":"A","value":0.1},
 {"year":2,"group":"A","value":0.2},
 {"year":3,"group":"A","value":0.2},
 {"year":4,"group":"A","value":0.1},
 {"year":5,"group":"A","value":0.1},
 {"year":1,"group":"B","value":0.1},
 {"year":2,"group":"B","value":0.2},
 {"year":3,"group":"B","value":0.2},
 {"year":4,"group":"B","value":0.2},
 {"year":5,"group":"B","value":0.9},
 {"year":6,"group":"B","value":0.1}
]


let getSubsets = (group = 'B', year = 6) => myData.filter(d => d.group == group && d.year < year)

console.log(getSubsets())

console.log(getSubsets('A', 4))

let yearGroups = [1,2,3,4,5].map(y => getSubsets('B', y)).filter(a => !!a.length)

console.log(yearGroups)
0 голосов
/ 05 сентября 2018

Вы можете сначала создать Set, который содержит все годы группы A, чем можно отфильтровать элемент из массива (если в наборе присутствует год, а в группе B, а затем добавить его к результату) :

var myData = [{"year":1,"group":"A","value":0.1}, {"year":2,"group":"A","value":0.2}, {"year":3,"group":"A","value":0.2}, {"year":4,"group":"A","value":0.1}, {"year":5,"group":"A","value":0.1}, {"year":1,"group":"B","value":0.1}, {"year":2,"group":"B","value":0.2}, {"year":3,"group":"B","value":0.2}, {"year":4,"group":"B","value":0.2}, {"year":5,"group":"B","value":0.9}, {"year":6,"group":"B","value":0.1}];

let set = new Set(myData.filter(e=>e.group =="A").map(e=>e.year));

let result = myData.filter(e=> e.group =="B" && set.has(e.year));

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...