Как изменить значение для свойства объекта в массиве, если свойство не совпадает с сравниваемым значением?

#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; }