Копировать структуру объектов без значений - PullRequest
0 голосов
/ 07 января 2020

Я обнаружил, что мне нужно скопировать структуру объекта без каких-либо значений.

Например:

var foo = {
  name: 'Leo',
  address: '1234 Road'
}

var bar = someFunction(foo);

// bar now should equal:
// {
//   name: undefined,
//   address: undefined
// }

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

Спасибо

Отредактировано, чтобы исправить опечатки

Я выбрал ответ, который я сделал, потому что это один Я решил использовать, но все ответы были превосходны.

Спасибо

Ответы [ 4 ]

1 голос
/ 07 января 2020

Использование Object.keys(), чтобы сначала получить свойства исходного объекта. Во-вторых, вы можете использовать, например, Array.prototype.reduce() для создания нового объекта с ожидаемыми ключами и значениями.

Это может работать для вас:

const foo = {
  name: 'Leo',
  address: '1234 Road'
};

const result = Object.keys(foo).reduce((a,c) => {
  a[c] = undefined;
  return a;
}, {});

console.log(result);

Надеюсь, это поможет!

0 голосов
/ 08 января 2020

Использование Object.keys()

var foo = {
  name: 'Leo',
  address: '1234 Road'
}

let newFoo = {}

for (let key of Object.keys(foo)) {
    newFoo[key] = undefined    
}

console.log(newFoo)
0 голосов
/ 08 января 2020

Если у вас есть вложенные объекты, вы можете использовать простой рекурсивный алгоритм, чтобы установить любое значение, которое не является объектом, на undefined, а затем рекурсивно применить то же преобразование к любым вложенным объектам:

var foo = {
  name: 'Leo',
  address: '1234 Road',
  department: {
    name: "accounting",
    location: "third floor"
  },
  favouriteFood: ["pancakes", "fish"]
};

var bar = someFunction(foo);

console.log(bar);

function someFunction(input) {
  //return `undefined` for primitives and arrays
  if (typeof input !== "object" || Array.isArray(input))
    return undefined;
  
  //otherwise go over all the entries of the object
  return Object.entries(input)
    //and make a new object
    .reduce((acc, [key, value]) => {
      //recursively call `someFunction` to handle the value
      var newValue = someFunction(value);
      
      return {
        ...acc, //copy the object  
        [key]: newValue //add the current key-(mapped)value pair
      };
    }, {})
}

Это можно сократить до следующего:

var foo = { name: 'Leo', address: '1234 Road', department: { name: "accounting", location: "third floor" }, favouriteFood: ["pancakes", "fish"]};

var bar = someFunction(foo);

console.log(bar);

function someFunction(input) {
  if (typeof input !== "object" || Array.isArray(input))
    return undefined;
    
  return Object.entries(input)
    .reduce((acc, [key, value]) => ({...acc, [key]: someFunction(value)}), {});
}

А вот реализация, использующая for..of l oop вместо Array#reduce:

var foo = { name: 'Leo', address: '1234 Road', department: { name: "accounting", location: "third floor" }, favouriteFood: ["pancakes", "fish"]};

var bar = someFunction(foo);

console.log(bar);

function someFunction(input) {
  if (typeof input !== "object" || Array.isArray(input))
    return undefined;
  
  const obj = {};
  
  for (const [key, value] of Object.entries(input)) {
    obj[key] = someFunction(value);
  }
  
  return obj;
}
0 голосов
/ 07 января 2020

Если ваш объект простой (без вложенности), то вы можете использовать Object.keys для получения ключей, .map для создания массивов каждого из них и Object.fromEntries для создания конечного результата:

const structure = o => Object.fromEntries(Object.keys(o).map(k=>[k]));

var foo = {
  name: 'Leo',
  address: '1234 Road'
}

var bar = structure(foo);

console.log(bar);

Object.fromEntries ожидает массив пар, но поскольку мы предоставляем массив одноэлементных массивов, второе значение в каждой паре отсутствует (т. Е. Равно undefined ) и поэтому он даст желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...