У меня есть 2 массива:
var links = [
{
code: 'home'
},
{
code: 'contact'
},
];
var subLinks = [
{
code: 'some subLink',
parent: {
code: 'home'
}
},
{
code: 'some subLink 2',
parent: {
code: 'home'
}
},
{
code: 'some subLink 3',
parent: {
code: 'contact'
}
}
];
Мне нужно иметь Object (ссылка как ключ с массивом subLinks):
var menu = {
home: ["some subLink", "some subLink 2"],
contact: ["some subLink 3"]
};
В этот момент у меня есть это...
links.map(link => ({
[link.code]: subLinks.map(subLink => (subLink.parent.code === link.code && subLink.code))
}))
Я очень люблю преобразования массива с использованием функциональных JS...
const menu = {};
links.map(link => menu[link.code] = subLinks
.filter(sl => sl.parent.code === link.code)
.map(sl => sl.code)
);
Используя уменьшить...
const menu = links.reduce((memo, menu) => {
memo[menu.code] = subLinks
.filter(sl => sl.parent.code === menu.code)
.map(sl => sl.code);
return memo;
},{});
И то, и другое довольно мило, но сокращение необходимости создавать переменную для изменения внутри циклов может быть немного слаще.
subLinks
точно links.length
.
Вы можете сделать это за два прохода: во-первых, вы перебираете свои links
чтобы создать базовый объект с вашими родительскими ссылками. Затем вы перебираете свои subLinks
чтобы добавить их в соответствующую ссылку, добавленную в первый проход.
Это имеет то преимущество, что он явно только выполняет итерацию каждого из ваших исходных массивов один раз.
var links = [
{ code: 'home' },
{ code: 'contact' },
];
var subLinks = [
{ code: 'some subLink', parent: { code: 'home' } },
{ code: 'some subLink 2', parent: { code: 'home' } },
{ code: 'some subLink 3', parent: { code: 'contact' } }
];
// pass 1
var result = {};
for (var i = 0; i < links.length; i++) {
result[links[i].code] = [];
}
// pass 2
for (var i = 0; i < subLinks.length; i++) {
var subLink = subLinks[i];
result[subLink.parent.code].push(subLink.code);
}
console.log(result);
Обратите внимание, что в вашем примере вам явно не нужны links
. Вы также можете построить родительскую ссылку по требованию всякий раз, когда вы сталкиваетесь с дополнительной связью с родителем, который еще не существует.
Но если это отдельно, вы можете расширить свою структуру и включить другую информацию.
var x = subLinks.reduce((c, v) => {
if(c.hasOwnProperty(v.parent.code)) c[v.parent.code].push(v.code);
else c[v.parent.code] = [v.code];
return c;
}, {});
var links = [
{ code: 'home' },
{ code: 'contact' },
];
var subLinks = [
{ code: 'some subLink', parent: { code: 'home' } },
{ code: 'some subLink 2', parent: { code: 'home' } },
{ code: 'some subLink 3', parent: { code: 'contact' } }
];
var menu={};
for(var i=0;i<links.length;i++){
var code = links[i].code;
menu[code]=[];
for(var j=0;j<subLinks.length;j++){
var subLink = subLinks[j];
if(subLink.parent && subLink.parent.code == code){
menu[code].push(subLink.code);
}
}
}
console.log(menu)
subLinks
точно links.length
.
Другое решение:
var links = [{
code: 'home'
}, {
code: 'contact'
}];
var subLinks = [{
code: 'some subLink',
parent: {
code: 'home'
}
}, {
code: 'some subLink 2',
parent: {
code: 'home'
}
}, {
code: 'some subLink 3',
parent: {
code: 'contact'
}
}];
const result = links.reduce((o, x) => {
o[x.code] = subLinks.filter(f => f.parent.code == x.code).map(m => m.code);
return o;
}, {});
console.log(result);
Документации:
Двойной цикл:
var links = [
{
code: 'home'
},
{
code: 'contact'
},
];
var subLinks = [
{
code: 'some subLink',
parent: {
code: 'home'
}
},
{
code: 'some subLink 2',
parent: {
code: 'home'
}
},
{
code: 'some subLink 3',
parent: {
code: 'contact'
}
}
];
var menu = {};
for(var i=0;i<links.length;i++){
var prop = links[i].code;
var child;
menu[prop]=[];
for(var j=0;j<subLinks.length;j++){
var parent = subLinks[j].parent.code;
if(parent==prop){
child = subLinks[j].code;
menu[prop].push(child);
}
}
}
console.log(menu);
map
вернет массив. Подумайте обreduce
.