Как расширить массив на основе другого массива?

184
13 апреля 2018, 16:22

var array1 = [ 
	{name: "dima"} 
]; 
 
var array2 = [ 
	{ 
  	name: "dima", 
    age: 22, 
    notes: "test0" 
  }, 
  { 
  	name: "oleg", 
    age: 27, 
    notes: "test1" 
  }, 
  { 
  	name: "vasja", 
    age: 44, 
    notes: "test2" 
  } 
];
Как сделать чтобы первый массив расширил себя используя значения второго массива? То есть мне нужно сделать, чтобы было вот так.

var array1 = [ 
      { 
      name: "dima", 
      age: 22, 
      notes: "test0" 
      } 
];

И нужно чтобы это работало с другими значениями, то есть если у нас в первом массиве другой name, то нужно чтобы брались свойства из второго массива у которого такой же name. Как такое сделать?

Answer 1

Так как мы имеем дело с объектами, оператором присваивания = их "копировать" будет неразумно: потому что это будет не копирование, а создание в массиве array1 референсных ссылок на объекты в элементах array2 (т.е., первый массив фактически не будет содержать присвоенные таким образом объекты).

Для копирования полей объекта, разумно использовать один из следующих способов (на них список не заканчивается, но эти два - основные):

  • рекурсивную функцию: проход по полям объекта-источника "вглубь" до уровня примитивов, и их присвоение соответствующим полям объекта-цели
  • статичный метод Object.assign.

Примеры ниже - демонстрируют второй подход, как наиболее простой и компактный.

Копирование полей только тех объектов, которые присутствуют в первом массиве:

var array1 = [ 
  { name: "dima" } 
]; 
 
var array2 = [ 
  { name: "dima",  age: 22, notes: "test0" }, 
  { name: "oleg",  age: 27, notes: "test1" }, 
  { name: "vasja", age: 44, notes: "test2" } 
]; 
 
function objArrMerge(target, source) { 
  const findTargetObj = n => target.find(o => o.name === n); 
  let tObj; 
  for (let i = 0; i < source.length; i++) { 
    if (source[i].name && source[i].name.length && (tObj = findTargetObj(source[i].name))) 
      tObj = Object.assign(tObj, source[i]); 
  } 
} 
 
objArrMerge(array1, array2); 
document.body.style.cssText = 'font: 14px monospace; white-space: pre;'; 
document.body.textContent = 'array1:\n' + JSON.stringify(array1, null, 2);

Копирование полей всех объектов (если в первом массиве объект отсутствует - он будет создан):

var array1 = [ 
  { name: "dima" } 
]; 
 
var array2 = [ 
  { name: "dima",  age: 22, notes: "test0" }, 
  { name: "oleg",  age: 27, notes: "test1" }, 
  { name: "vasja", age: 44, notes: "test2" } 
]; 
 
array1 = Object.assign(array1, array2); 
 
document.body.style.cssText = 'font: 14px monospace; white-space: pre;'; 
document.body.textContent = 'array1:\n' + JSON.stringify(array1, null, 2);

Answer 2

можно сделать так:

for(i=0; i < array1.length;i++) 
{
 if(array2[i].name == array1[i].name)
 {
  array1[i] = array2[i];
 }
}
READ ALSO
Как добавить текст внизу кнопки в react?

Как добавить текст внизу кнопки в react?

Использую react-js и библиотеку https://material-ui-nextcom/demos/buttons/

161
Что использовать, что бы метод работал пока не пройдет определенное время?

Что использовать, что бы метод работал пока не пройдет определенное время?

Нужно чтобы метод работал определенное время, например выводил в textarea слово 5 секунд, что для этого можно использовать?

158
django + ajax - поиск лучшего подхода

django + ajax - поиск лучшего подхода

Добрый деньЕсть простой тестовый проект на Django

152