#javascript #node.js
#javascript #node.js
Вопрос:
У меня есть массив языков программирования, таких как:
const tags = ["js", "ruby", "ios", "python", "go"];
У меня также есть список таких пользователей, как:
const user = [
{
"id": "userId_1",
"language": ["ruby", "ios"]
},
...
];
Есть ли хороший способ заполнить массив, названный именем языка, идентификаторами пользователей?
Что — то вроде:
const ruby = ["userId_1", "userId_3", "userId_8", ...];
Комментарии:
1. Имя переменной не будет переведено, вы должны охватить его.
2. он имел в виду
id
, а не имя переменной.3. @WilliamWang я имел в виду, что имя переменной
ruby
стирается. Вы должны сохранить его в имени с ограниченной областью действия.4. ах, да, правильно. согласно моему ответу, мы должны вызвать его по output.ruby , …
Ответ №1:
Вы можете использовать Array.reduce() .
const tags = ["js", "ruby", "ios", "python", "go"];
const user = [
{
"id": "userId_1",
"language": ["ruby", "ios"]
},
{
"id": "userId_2",
"language": ["ruby", "python"]
},
{
"id": "userId_3",
"language": ["go", "ios"]
},
];
const output = user.reduce((acc, cur) => {
cur.language.forEach(lang => {
if (!acc[lang]) acc[lang] = [];
acc[lang].push(cur.id);
});
return acc;
}, {});
console.log(output);
Комментарии:
1. Вам даже не нужен массив тегов, верно?
2. исправьте на данный момент, просто теги понадобятся, если вам нужны все теги в выходных данных для рефакторинга выходных данных.
3. Хм, у меня получилось что-то вроде
{ '[object Object]': [ 'userId_1', 'userId_2',
4. можете ли вы запустить приведенный выше фрагмент кода? результат говорит
{ "ruby": [ "userId_1", "userId_2" ], "ios": [ "userId_1", "userId_3" ], "python": [ "userId_2" ], "go": [ "userId_3" ] }
5. Да, неважно, что у моего «кода реального мира» только что возникла проблема с типом (по сути, язык — это объект! Спасибо за твою помощь, парень!
Ответ №2:
Неплохо было бы что-нибудь покороче:
const ruby = user.map((user) => user.language.includes("ruby") ? user.id : undefined);