JavaScript - Объект из двух массивов (родительский и дочерний элементы)

1

У меня есть 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))
}))
  • 2
    map вернет массив. Подумайте об reduce .
Теги:

6 ответов

3

Я очень люблю преобразования массива с использованием функциональных 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;
},{});

И то, и другое довольно мило, но сокращение необходимости создавать переменную для изменения внутри циклов может быть немного слаще.

  • 0
    Обратите внимание, что это полностью subLinks точно links.length .
  • 0
    Там не было никаких спецификаций нотации;)
Показать ещё 2 комментария
1

Вы можете сделать это за два прохода: во-первых, вы перебираете свои 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. Вы также можете построить родительскую ссылку по требованию всякий раз, когда вы сталкиваетесь с дополнительной связью с родителем, который еще не существует.

Но если это отдельно, вы можете расширить свою структуру и включить другую информацию.

1
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; 
}, {});
  • 0
    Отлично сработано ! :-)
1

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)
  • 0
    Обратите внимание, что это полностью subLinks точно links.length .
0

Другое решение:

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

Документации:

0

Двойной цикл:

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);
  • 0
    Спасибо Вернер, так лучше

Ещё вопросы

Сообщество Overcoder
Наверх
Меню