В JavaScirpt, как отфильтровать элементы одного поля в двух массивах и вернуть новый двумерный массив - PullRequest
0 голосов
/ 10 июля 2019

Это пример :

Я хочу перегруппировать arry2 в соответствии с полями в arry1

var arry1 = [
  {id: 1, parentId: 0, name: "phone"},
  {id: 2, parentId: 1, name: "nick"}
];

var arry2 = [
  {id: 7, parentId: 0, name: "phone_item1"},
  {id: 8, parentId: 1, name: "phone_item2"},
  {id: 9, parentId: 0, name: "nick_item1"},
  {id: 10, parentId: 1, name: "nick_item2"}
];


let newArrys = arry1.filter((item)=>{
   return leve_two.indexOf(arry2.parentId) == -1
})

Я хочу вернуть двумерный массив:

[[
  {id: 7, parentId: 0, name: "phone_item1"},
  {id: 9, parentId: 0, name: "nick_item1"}
],[
  {id: 8, parentId: 1, name: "phone_item2"},
  {id: 10, parentId: 1, name: "nick_item2"}
]]

Я пытался Array.filter и т. Д.

Вы можете мне помочь?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

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

const arr1 = [
  {id: 1, parentId: 0, name: "phone", level: 0, productCount: 0},
  {id: 2, parentId: 1, name: "nick", level: 0, productCount: 0}
];

const arr2 = [
  {id: 7, parentId: 0, name: "phone_item1", level: 1, productCount: 0},
  {id: 8, parentId: 1, name: "phone_item2", level: 1, productCount: 0},
  {id: 9, parentId: 0, name: "nick_item1", level: 1, productCount: 0},
  {id: 10, parentId: 1, name: "nick_item2", level: 1, productCount: 0}
];

const filterIds = arr1.map(({ parentId }) => parentId);

const arr3 = Object.values(arr2.reduce((r, c) => {
  r[c.parentId] = r[c.parentId] || [];
  r[c.parentId].push(c);
  return r;
}, {}));

console.log(arr3);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 10 июля 2019

Это выглядит так же, как группировка arry2 по parentId, а arry1 выглядит бесполезным ?

Используйте для этого некоторую библиотеку lib.Например, путь Рамда:

const result = R.pipe(
  R.groupBy(R.prop("parentId")),
  R.toPairs,
  R.map(R.last)
)(arry2)
...