Обращение преобразования Object.entries

Я использую Object.entries, чтобы получить некоторые значения из вложенного объекта и фильтровать его.

obj = Object.entries(obj)
  .filter(([k, v]) => {
    return true; // some irrelevant conditions here
  });

Мой объект заканчивается массивом массивов, ключей и vals.

[['key1', val]['key2', val']['key3', val]]

Есть ли простой способ отобразить их обратно в объект? Исходная структура объекта:

{ key:val, key2:val2, key3:val3 }

Ответы

Ответ 1

Конечно, просто используйте .reduce, чтобы назначить новый объект:

const input = { key:'val', key2:'val2', key3:'val3' };

const output = Object.entries(input)
  .filter(([k, v]) => {
    return true; // some irrelevant conditions here
  })
  .reduce((accum, [k, v]) => {
    accum[k] = v;
    return accum;
  }, {});
console.log(output);

Ответ 2

Использование Object.assign с картой, отображающей [k,v] => {[k]: v}

Например, приведенный ниже код будет хранить ключи, начинающиеся с key

var obj = {
  key: 1,
  key2: 2,
  key3: 3,
  removed: 4,
  alsoRemoved: 5
}

obj = Object.assign({}, ...Object.entries(obj)
    .filter(([k, v]) => {
        return k.startsWith('key');
    })
    .map(([k, v]) => ({[k]: v}))
);

console.log(obj);

Ответ 3

Для новых браузеров используйте Object.fromEntries:

Object.fromEntries(arr); 

Для ES6+ с некоторым распространением может быть один вкладыш.

arr.reduce((a,[k,v])=>({...a,[k]:v}),{}) 

Образец

Object.entries(sampleObject) // Turn object to array
   .reduce((a,[k,v])=>({...a,[k]:v}),{}) // Turn it back to object.

Ответ 4

Использование Reduce с деконструкцией и оператором запятой:

const input = { key:'val', key2:'val2', key3:'val3' };

const output = Object.entries(input)
  .filter(([k, v]) => {
     return true; // some irrelevant conditions here
  })
  .reduce((acc, [k, v]) => (acc[k] = v, acc), {});

который должен обеспечивать ту же функциональность, что и ответ CertainPerformance, с немного более кратким синтаксисом

Ответ 5

Если вы точно знаете, какие записи вы хотите исключить, вы можете использовать деконструкцию объекта в сочетании с распространением:

function clean(obj) {
  const { unwanted1, unwanted2, ...wanted } = obj;
  return { ...wanted };
}

В некоторых случаях это может быть самым чистым решением.