#arrays #angular #typescript #angular8
Вопрос:
У меня есть два массива следующим образом, и я пытаюсь объединить их с идентификатором в этом случае, menuNo-это идентификатор, и после этого у него будет новый массив с дочерними элементами в качестве вывода. Родительское меню с дочерними меню.
Массив 1:
[
{
"menuNo": "1001",
"menuName": "All Forms",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "0",
"childMenu": null,
"iconName": null
},
{
"menuNo": "1003",
"menuName": "All Forms 2",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "0",
"childMenu": null,
"iconName": null
},
{
"menuNo": "1006",
"menuName": "All Forms 3",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "0",
"childMenu": null,
"iconName": null
}
]
Массив 2:
[
{
"menuNo": "1002",
"menuName": "Child 1",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "1001",
"childMenu": null,
"iconName": null
},
{
"menuNo": "1012",
"menuName": "Child 2",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "1001",
"childMenu": null,
"iconName": null
},
{
"menuNo": "1014",
"menuName": "Child 1",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "1006",
"childMenu": null,
"iconName": null
},
{
"menuNo": "1019",
"menuName": "Child 2",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "1006",
"childMenu": null,
"iconName": null
},
Ожидаемый результат в формате jSon:
[{
"menuNo": "1001",
"menuName": "All Forms",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "0",
"childMenu": "Child 1", "Child 2",
"iconName": null
},
{
"menuNo": "1006",
"menuName": "All Forms 3",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "0",
"childMenu": "Child 1", "Child 2"
"iconName": null
}]
Попробовал это сделать, но он объединяет все данные только по идентификатору следующим образом:
//Merge two jSon object
const mergeById = (array1, array2) =>
array1.map(itm => ({
...array2.find((item) => (item.id === itm.id) amp;amp; item),
...itm
}));
Мой план состоит в том, чтобы создать меню с подменю в виде списка. Как я могу это сделать?
Ответ №1:
- Вам нужно использовать
Array.filter
наarray2
основеchild.parentMenu === parent.menuNo
. - Далее, фильтр
child
не является ни пустым массивом, ниnull
.
const mergeById = (array1, array2) =>
array1.map(parent => ({
...parent,
childMenu: array2.filter((child) => child amp;amp; (child.parentMenu === parent.menuNo))
.map(child => child amp;amp; child.menuName)
}));
var result = mergeById(array1, array2)
.filter(x => x.childMenu amp;amp; x.childMenu.length > 0);
Фрагмент кода и результат
var array1 = [
{
"menuNo": "1001",
"menuName": "All Forms",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "0",
"childMenu": null,
"iconName": null
},
{
"menuNo": "1003",
"menuName": "All Forms 2",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "0",
"childMenu": null,
"iconName": null
},
{
"menuNo": "1006",
"menuName": "All Forms 3",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "0",
"childMenu": null,
"iconName": null
}
];
var array2 = [
{
"menuNo": "1002",
"menuName": "Child 1",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "1001",
"childMenu": null,
"iconName": null
},
{
"menuNo": "1012",
"menuName": "Child 2",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "1001",
"childMenu": null,
"iconName": null
},
{
"menuNo": "1014",
"menuName": "Child 1",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "1006",
"childMenu": null,
"iconName": null
},
{
"menuNo": "1019",
"menuName": "Child 2",
"groupNo": null,
"groupName": null,
"menuStatus": null,
"groupStatus": null,
"parentMenu": "1006",
"childMenu": null,
"iconName": null
}
];
const mergeById = (array1, array2) =>
array1.map(parent => ({
...parent,
childMenu: array2.filter((child) => child amp;amp; (child.parentMenu === parent.menuNo))
.map(child => child amp;amp; child.menuName)
}));
var result = mergeById(array1, array2)
.filter(x => x.childMenu amp;amp; x.childMenu.length > 0);
console.log(result);
Комментарии:
1. В некоторых случаях ребенок может быть пустым. Я думаю, все вышесказанное должно сработать.
2. Обновлено до
array2.filter((child) => child amp;amp; (child.parentMenu === parent.menuNo))
.3. Не могли бы вы проверить ожидаемый результат в посте? Он обновлен, возможно, я был недостаточно ясен. Да, именно так.
4. Ваш JSON недействителен,
childMenu
так и должно быть"childMenu": ["Child 1", "Child 2"]
.5. Решено @Yong Shun — Большое спасибо.