Фильтрация вложенного массива в JavaScript: оставляем только нужные ключи

Привет, друзья! У меня возникла небольшая проблема с обработкой массива объектов в JavaScript. Есть массив, в котором каждый объект содержит разные ключи. Мне нужно оставить только определенные ключи, а остальные удалить. Вот пример:

let исходныйМассив = [
  { оставить1: 'раз', оставить2: 'два', удалить1: 123, удалить2: 456 },
  { оставить3: 'три', оставить4: 'четыре', удалить3: 789, удалить4: 101112 }
];

let списокНужныхКлючей = ['оставить1', 'оставить2', 'оставить3', 'оставить4'];

// Нужно получить такой результат:
let результат = [
  { оставить1: 'раз', оставить2: 'два' },
  { оставить3: 'три', оставить4: 'четыре' }
];

Как лучше это сделать? Хотелось бы избежать простого перебора массива и создания нового. Может, есть какой-то элегантный способ? Заранее спасибо за помощь!

есть простой способ решить эту задачу с помощью метода map() и оператора (…). вот как это можно сделать:

let результат = исходныйМассив.map(obj => {
  return Object.fromEntries(
    Object.entries(obj).filter(([key]) => списокНужныхКлючей.includes(key))
  );
});

этот код пройдется по каждому объекту в массиве, отфильтрует только нужные ключи и создаст новый объект только с этими ключами. получится именно то, что тебе нужно без лишнего кода и перебора. надеюсь, это поможет! если что-то непонятно, спрашивай.

Можно решить эту задачу используя reduce() и Object.keys(). Вот пример:

const результат = исходныйМассив.reduce((acc, obj) => {
  const filteredObj = Object.keys(obj).reduce((filtered, key) => {
    if (списокНужныхКлючей.includes(key)) filtered[key] = obj[key];
    return filtered;
  }, {});
  return [...acc, filteredObj];
}, []);

Этот подход эффективен, так как проходит по массиву только один раз. Он также избегает создания промежуточных массивов, что может быть полезно при работе с большими данными.

А можно просто использовать Object.assign() с пустым объектом и списком нужных ключей. Типа так:

результат = исходныйМассив.map(obj =>
Object.assign({}, …списокНужныхКлючей.map(key =>
key in obj ? { [key]: obj[key] } : {}
))
);

Получается коротко и ясно. И работает быстро даже на больших массивах. Что скажешь, попробуешь?