Как сравнить с двумя массивами данных и chage?

#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 .

Источник