#javascript #arrays
#javascript #массивы
Вопрос:
У меня есть массив чисел A и массив данных B
Им просто нравится:
A:
[11, 14]
B:
[
{ title: 'title 1', data: [ { node_id: 11, selected: false }, { node_id: 14, selected: false } ]},
{ title: 'title 2', data: [ { node_id: 70, selected: false } ]}
]
Мой код выглядит так:
B.map((value) => {
A.map((selectedDeviceId) => {
value.data.map((valueData) => {
selectedDeviceId === valueData.node_id
? (valueData.selected = true)
: (valueData.selected = false);
});
});
});
Но когда я печатаю массив B, результат:
[
{ title: 'title 1', data: [ { node_id: 11, selected: false }, { node_id: 14, selected: true } ]},
{ title: 'title 2', data: [ { node_id: 70, selected: false } ]}
]
Я надеюсь, что они должны быть:
[ { node_id: 11, selected: true }, { node_id: 14, selected: true } ]
Что не так в моем коде?
Комментарии:
1. Можете ли вы объяснить, что вы пытаетесь сделать? Вы указали входные данные, ожидаемые результаты, но нам не хватает информации о том, что такое операция. Вы также дали код, который не работает, так что это очень плохой способ попытаться выяснить, что с ним не так.
2. Если вас не интересует возвращаемое значение
.map()
, то.map()
это не тот инструмент
Ответ №1:
Вы могли бы использовать array Array.prototype.flatMap()
с Array.prototype.filter()
методом, чтобы получить результат. Пройдите по массиву с помощью flatMap, а затем используйте метод filter с Array.prototype.some()
для фильтрации идентификаторов узлов.
const number = [11, 14];
const data = [
{
title: 'title 1',
data: [
{ node_id: 11, selected: false },
{ node_id: 14, selected: false },
],
},
{ title: 'title 2', data: [{ node_id: 70, selected: false }] },
];
const ret = data.flatMap((x) =>
x.data.filter((y) => number.some((z) => z === y.node_id))
);
console.log(ret);
Ответ №2:
Чистый способ сделать это.
const A = [11, 14];
const B = [{
title: 'title 1',
data: [{
node_id: 11,
selected: false
}, {
node_id: 14,
selected: false
}]
},
{
title: 'title 2',
data: [{
node_id: 70,
selected: false
}]
}
]
const resultList = B.map((_b) => {
return { ..._b,
data: _b.data.map(_d => {
return { ..._d,
selected: A.includes(_d.node_id)
}
})
}
})
console.log(resultList)
Комментарии:
1. Можете ли вы объяснить свой ответ?
Ответ №3:
let A = [11, 14];
let B = [
{ title: 'title 1', data: [ { node_id: 11, selected: false }, { node_id: 14, selected: false } ]},
{ title: 'title 2', data: [ { node_id: 70, selected: false } ]}
];
B.forEach(value => {
A.forEach(selectedDeviceId => {
const checkData = value.data.find(v => v.node_id === selectedDeviceId);
if (checkData) {
checkData['selected'] = true;
}
});
});
console.log(B);
Ответ №4:
решение @mr hr более лаконично, но без изменения многого из того, что у вас уже есть, вам следует еще раз взглянуть на свою троичную операцию. Вы должны отредактировать его, чтобы
B.map((value) => {
A.map((selectedDeviceId) => {
value.data.map((valueData) => {
selectedDeviceId === valueData.node_id
amp;amp; (valueData.selected = true);
});
});
});
Ответ №5:
Ошибка заключается в том, что вы не используете результаты функции map(), на самом деле вы используете ее неправильно, это должно быть: .map(value => {return something;})
или .map(value => something)
Когда не использовать map()
Поскольку map создает новый массив, его использование, когда вы не используете возвращаемый массив, является антишаблоном; вместо этого используйте forEach или for-of .