Сравните два объекта и добавьте различия, не манипулируя существующими

1

У меня есть объект, который выглядит так:

var obj = {
  1: {
    'x': [ [], [], [] ],
    'y': [ [], [] ],
  },
  2: {
    'x': [ [], [] ],
    'z': [ [] ],
  },  
}

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

var newObj = {};

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

В соответствии с различием добавьте отсутствующие и удалите удаленные. Однако, делая это различие, я хочу только добавлять новые ключи и значения, подобные этому: 'new': [ [] ], но сохраняйте существующие, если они существуют, и не трогают их. Добавляйте только отсутствующий ключ с пустым значением массива.

Есть способ сделать это?

Вот сценарий, где я более подробно объяснил примеры: https://jsfiddle.net/7ccd3una/1/


Если:

var newObj = {
  1: {
    'x': [ [], [], [] ],
  },
  2: {
    'z': [ [] ],
  },  
}

и obj

var obj = {
  1: {
    'x': [ [], [], [] ],
    'y': [ [], [] ],
  },
  2: {
    'x': [ [], [] ],
    'z': [ [] ],
  },  
}

После вызова функции я хочу, чтобы newObj был таким (добавьте только 1 пустой массив для новых):

newObj = {
  1: {
    'x': [ [], [], [] ],
    'y': [ [] ]
  },
  2: {
    'x': [ [] ],
    'z': [ [] ],
  },  
}

Полный пример:

newObj = {} // just initialised.

obj = {
  1: {
    'x': [ [], [], [] ],
    'y': [ [] ]
  },
}

// newObj becomes, 

newObj : {
  1: {
    'x': [ [] ],
    'y': [ [] ]
  },
}

// This newObj can get structured itself. So it can become like:

newObj : {
  1: {
    'x': [ [], [], [] ],
    'y': [ [] ]
  },
}
// ..separately from the obj.

// So I want to watch the letter key adds and removes actually. Let say obj became:

obj : {
  1: {
    'x': [ [] ],
    'y': [ [] ],
    'd': [ [], [] ],
  },
  2: {
    'a': [ [], [], [] ],
    'b': [ [], [] ]
  }
}

// I want newObj to be:

newObj : {
  1: {
    'x': [ [], [], [] ],
    'y': [ [] ],    // don't do anything to existings
    'd': [ [] ],    // add empty array for new letter key
  },
  2: {
    'a': [ [] ],  // add empty array for letter key
    'b': [ [] ]   //  ""
  }
}

// And if items removed:
obj : {
  1: {
    'x': [ [] ]
}

// newObj becomes:
 newObj: {
    1: {
      'x': [ [], [], [] ]
    }
 }
  • 0
    Как вы сравниваете массивы? По ссылке? Потому что в зависимости от того, как вы определили свой объект, они не используют одни и те же ссылки на объекты, поэтому все вложенные массивы будут разными .
  • 0
    Я хочу, чтобы они были другими. Все, что я хочу, это добавить недавно добавленные (буквы) с пустым значением массива, ничего не делать с существующими или полностью удалить его, если удален буквенный ключ.
Показать ещё 2 комментария
Теги:

1 ответ

0

Попробуй это:

function copy(obj, newObj) {


var keys = Object.keys(obj)
keys.map(function(val){

if(newObj.hasOwnProperty(val)){

var keys_two = Object.keys(obj[val])

keys_two.map(function(prop){
   if(!newObj.hasOwnProperty(prop)){
      var data_two = obj[val][prop]
      newObj[val][prop] = data_two;
   
   }
})
} else {
   var data = obj[val]
   newObj[val] = data;
 
}

})

}

Вот на jsFiddle

  • 0
    Дайте мне знать, если чего-то не хватает
  • 0
    Спасибо за ваше время. Однако я не хочу, чтобы это точно копировалось. Если добавлено, я хочу добавить только с 1 пустым массивом child, а не с тем, сколько там. Я обновил свой вопрос, пожалуйста, проверьте его также
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню