JavaScript: Как скопировать несколько ключей из вложенного объекта путем деструктуризации - PullRequest
3 голосов
/ 08 мая 2019

Скажите, у меня есть объект:

myObj = { 
  name: 'Luke',
  age: 12,
  height: '163cm',
  weight: '60kg',
  others: { one: '1', two: '2', three: '3'} // (Edited) Added one more key here :)
};

Я хочу получить копию этого объекта без определенных ключей для нового объекта таким образом, чтобы вывод был таким, как показано ниже:

newObj = { 
      name: 'Luke',
      age: 12,
      one: '1',
      two: '2'
    };

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

Ответы [ 3 ]

5 голосов
/ 08 мая 2019

Один из способов добиться этого с использованием деструктурного синтаксиса будет выглядеть так:

const myObj = { 
  name: 'Luke',
  age: 12,
  height: '163cm',
  weight: '60kg',
  others: { one: '1', two: '2', three : '3'}
};


const newObj = {
  /* Copy over values from "myObj" to equivalent keys in "newObj" */
  name : myObj.name,
  age : myObj.age,

  /* Spread keys "one" and "two" of the nested "others" object into "newObj" */
  ...({one, two} = myObj.others, {one, two})
}

console.log(newObj)
4 голосов
/ 08 мая 2019

Для полноты возможен подход iife . Он работает, создавая функцию стрелки, которая принимает в качестве параметров ключи, которые вы хотите сохранить. В теле функции распределите вложенные объекты по желанию.

const myObj = { 
  name: 'Luke',
  age: 12,
  height: '163cm',
  weight: '60kg',
  others: { one: '1', two: '2'}
};

const newObj = (
  ({name, age, others}) => ({name, age, ...others})
)(myObj);

console.log(newObj);
2 голосов
/ 08 мая 2019

Для объекта неизвестной глубины вы можете попробовать использовать рекурсию.

  • Создание функции, которая принимает объект и массив ключей для удаления в качестве аргументов.
  • Создайте функцию helper (которая принимает 1 объект в качестве параметра) внутри main и создайте пустой объект.
  • Просмотрите свойства obj, используя for..in.
  • проверить, если key отсутствует в массиве ключей, которые будут удалены
    • Проверить, является ли значение объектом, затем рекурсивно вызвать функцию
    • Если это не объект, то добавить его к результату obj.
  • Наконец, верните объект результата.

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

const myObj = { 
  name: 'Luke',
  age: 12,
  height: '163cm',
  weight: '60kg',
  others: { one: '1', two: '2'}
};
const removed = ['height','weight','one'];

function removeKeys(obj,removed){
  const res = {};
  function helper(obj){
    for(let key in obj){
      if(!removed.includes(key)){
        if(typeof obj[key] === "object"){
          helper(obj[key]);
        }
        else res[key] = obj[key]
      }
    }
    
  }
  helper(obj)
  return res;
}

const res = removeKeys(myObj,removed);
console.log(res)
...