Как я могу создать объединенный объект из массива объектов, который сохраняет свойства в исходном объекте, не измененные из нового входящего объекта - PullRequest
0 голосов
/ 11 апреля 2019

Мне нужно, чтобы наборы объектов / массив ...

var test = [{id: 1, prop: 'bill', location: 'san diego'},{id: 11, prop: 'bright'}];
var test2 = [{id: 1, prop: 'casey'},{id: 11, prop: 'candle'}];

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

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

Проблема возникает из-за того, что значение нового объекта на ключ перезапишет предыдущий исходный объект в целом. Следовательно, свойство location удаляется из исходного массива.

В частности, из Object.assign () голый объект, не представленный в виде массива объектов, сохранит целостность исходного объекта и изменит только базовые свойства.

Вот пример обоих:

массив объектов:

var o1 = [{id: 1, prop: 'bill', location: 'san diego'},{id: 11, prop: 'bright'}];
var o2 = [{id: 1, prop: 'casey'},{id: 11, prop: 'candle'}];
var o3 = { c: 3 };

var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // 0: {id: 1, prop: "casey"} 1: {id: 11, prop: "candle"} c: 3

единственный объект:

var o1 = {id: 1, prop: 'bill', location: 'san diego'};
var o2 = {id: 1, prop: 'casey'};
var o3 = { c: 3 };

var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // {id: 1, prop: "casey", location: "san diego", c: 3}

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

Вот код отображения, над которым я работал:

var test = [{id: 1, prop: 'bill', location: 'san diego'},{id: 11, prop: 'bright'}];
var first = new Map();
for (const value of test) {
    //console.log(key + ' = ' + value.id);
    first.set(value.id, value);
    //console.log(first);
}
var test2 = [{id: 1, prop: 'casey'},{id: 11, prop: 'candle'}];
var second = new Map();
for (const value of test2) {
    second.set(value.id, value);
}

var merged = new Map([...first, ...second]);

let mergedArray = [];
for (var value of merged.values()) {
  console.log(' = ' + value);
    mergedArray.push(value);
}

console.log('merged', mergedArray);
// console.log(merged)

// console.log('second2', second);
// console.log('first2 ', first);

Ответы [ 3 ]

1 голос
/ 11 апреля 2019
const merged = test.map(ele => {
  const found = test2.find(({id}) => id === ele.id) || {}
  return {...ele, ...found}
})
  • цикл по test
  • найти тот же элемент id в test2 (если не найден, установить пустой объект)
  • вернуть объединенный объект, где test является источником, а test2 содержит перезаписи / дополнения
0 голосов
/ 12 апреля 2019

Предоставление этого ответа с использованием функции Map (), так что объект может быть сначала установлен в значение ключа. Принятый ответ является кратким и кратким, но это может иметь дополнительную ценность.

var test = [{id: 1, prop: 'bill', location: 'san diego'},{id: 11, prop: 'bright'}];
  var test2 = [{id: 1, prop: 'casey'},{id: 11, prop: 'candle'}];

  const map = new Map(test.map(obj => [obj.id, obj]));
  for (const item of test2) {
    if (map.has(item.id)) {
      // map.set( item.id, item ); // replace the item value
      map.set(item.id, { ...map.get(item.id),
        ...item
      }); 
    }
  }
  console.log(Array.from(map));
0 голосов
/ 11 апреля 2019

Попробуйте что-то вроде этого.

const test = [{
    id: 1,
    prop: 'bill',
    location: 'san diego'
  }, {
    id: 11,
    prop: 'bright'
  }, {
    id: 12, //not in test2
    prop: 'something',
    location: 'NY'
  },
  {
    id: 13, //no "prop" in test2
    prop: 'something',
    location: 'NY'
  }
];
const test2 = [{
    id: 1,
    prop: 'casey'
  }, {
    id: '11',
    prop: 'candle'
  },
  {
    id: 13,
    something: false
  },
  {
    id: 100, // not in test
    prop: 'other'
  }
];
test.forEach(t => {
  const t2 = test2.find(t2 => t2.id == t.id);//=== for exact match
  if (t2)
    t.prop = t2.prop || t.prop;
});
console.log(test);
...