#javascript
#javascript
Вопрос:
Я хочу вернуть массив со свойствами, которые не соответствуют valuesToCompare
значениям массива
const arr = [
{value: "test1", name: "name1"},
{value: "test2", name: "name1"},
{value: "test3", name: "name1"},
{value: "test3", name: "name2"},
{value: "test4", name: "name2"},
]
const valuesToCompare = ["test1", "test2", "test3", "test4"]
ожидаемый результат
[
{value: "test4", name: "name1"},
{value: "test1", name: "name2"},
{value: "test2", name: "name2"},
]
Комментарии:
1. Вопрос не ясен, объясните его лучше
2. Какова логика сопоставления?
3. Нужны подробности или ясность. valuesToCompare содержит test3 тогда почему он не является частью вывода?
4. я хочу вернуть значения, которых не было в значениях в
arr
5. Да, это не исключает и не сопоставляет valuesToCompare
Ответ №1:
Я не уверен, хотите ли вы сопоставлять или исключать на основе массива значений, поэтому предоставляю оба:
const arr = [{
value: "test1",
name: "name1"
},
{
value: "test2",
name: "name1"
},
{
value: "test3",
name: "name1"
},
{
value: "test3",
name: "name2"
},
{
value: "test4",
name: "name2"
},
]
const valuesToCompare = ["test1", "test2"]
const excluding = arr.filter(obj => !valuesToCompare.includes(obj.value))
console.log("Excluding values:")
console.log(excluding)
const matching = arr.filter(obj => valuesToCompare.includes(obj.value))
console.log("Matching values:")
console.log(matching)
Ответ №2:
Вы могли бы сделать, как показано ниже:
- сгруппируйте
arr
поname
- для каждой группы отфильтруйте значение
- сведите каждую группу обратно в объекты
const arr = [
{ value: "test1", name: "name1" },
{ value: "test2", name: "name1" },
{ value: "test3", name: "name1" },
{ value: "test3", name: "name2" },
{ value: "test4", name: "name2" },
];
const valuesToCompare = ["test1", "test2", "test3", "test4"];
const groupByName = arr.reduce((acc, el) => {
if (acc[el.name]) {
acc[el.name].push(el.value);
} else {
acc[el.name] = [el.value];
}
return acc;
}, {});
const res = Object.entries(groupByName)
.map(([k, v]) => [k, valuesToCompare.filter((vtc) => !v.includes(vtc))])
.map(([k, v]) => v.map((v) => ({ name: k, value: v })))
.flat();
console.log(res);
.as-console-wrapper { max-height: 100% !important; }