Выравнивание структуры объекта - PullRequest
1 голос
/ 22 января 2020

Community! Пожалуйста, дайте мне подсказку. У меня есть следующая задача:

Сначала создайте объект с такой структурой:

obj = {
       x: 10, 
       y: 20, 
       inner: {
          x: 20, 
          z: 30
            }, 
       foo2: {
          k: 23, 
          p: 13
       }
 } 

Напишите функцию convert (obj), она получит аргумент obj. Функция должна вернуть новый объект:

 newObj = {
    x: 20,
    y: 20,
    z: 30,
    k: 23,
    p: 13
}

Функция должна содержать только для ... in ... и typeof.

Я пытаюсь создать эту функцию, объект скопирован в newObj сейчас:

function convert(obj){
   newObj = {};
   for(key in obj){
      newObj[key] = obj[key];

   }
}

convert(obj);

Но я не уверен, как использовать typeof для удаления внутренних и подобъектов foo2 из obj и присвоить правильные значения x, z, k и p для newObj.

В классе мы говорили о базовых c вычислениях объектов, поэтому для решения этой задачи не требуются методы причудливых объектов.

Ответы [ 3 ]

5 голосов
/ 22 января 2020

Вам нужна рекурсия в этом случае

obj = {
   x: 10, 
   y: 20, 
   inner: {
      x: 20, 
      z: 30
        }, 
   foo2: {
      k: 23, 
      p: 13
   }
} 

function convert(obj, newObj) {
  if (!newObj) { // on first iteration creating a result object
    newObj = {}
  }
  for(key in obj){
    if (typeof obj[key] === 'number') { // if number - add, if exist - update
      newObj[key] = obj[key];
    } else { // if object - do the same one more time but for subobject and resulting object
      convert(obj[key], newObj)
    }
  }
  return newObj
}

console.log(convert(obj));
1 голос
/ 22 января 2020

Вы можете сделать это очень аккуратно с Object.entries, Object.fromEntries, функциями генератора и небольшой рекурсией.

Потому что последняя запись для свойства выигрывает при использовании Object.fromEntries, пока мы выравниваем порядок документов, победит «самая последняя» запись.

const obj = {x: 10, y: 20, inner: {x: 20, z: 30}, foo2: {k: 23, p: 13}}

function* getFlattenedEntries(obj) {
  let entries = Object.entries(obj);
  for (const [k, v] of entries) {
    // typeof array is "object", so we should guard against this
    if (typeof v === "object" && !Array.isArray(v)) {
      yield* getFlattenedEntries(v);
    } else {
      yield [k, v];
    }
  }
}

const flatten = obj => Object.fromEntries(getFlattenedEntries(obj));

console.log(flatten(obj))
1 голос
/ 22 января 2020
function convert(obj){
   newObj = {};
   for(key in obj){
     if(typeof(obj[key])==='object')
      {
       for(k in obj[key])
       {
         newObj[k]=obj[key][k]
       }
      }else{
       newObj[key]=obj[key]
      }


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