Сравнение и изменение двух массивов объектов - PullRequest
1 голос
/ 06 июня 2019

Я хочу сравнить каждый объект из двух массивов. Если имя свойства array1 совпадает с именем свойства array2, измените значение array2 на array1.

let array1 = [{
        name: 'test1',
        values: ['a', 'b', 'c']
    },
    {
        name: 'test2',
         values: ['w,','q','q' ]
    }
]

let array2 = [{
        name: 'test1',
        items: '...',
        settings: '...',
        values: []
    },
    {
        name: 'test9',
        items: '...',
        settings: '...',
        values: []
    },

    {
        name: 'test10',
        items: '...',
        settings: '...',
        values: []
    },

    {
        name: 'test2',
        items: 'test2',
        settings: '...',
        values: []
    },
]

ожидается возврат нового массива из массива 2 -

let array2New = [{
            name: 'test1',
            items: '...',
            settings: '...',
            values: ['a', 'b', 'c']
        },
        {
            name: 'test9',
            items: '...',
            settings: '...',
            values: []
        },

        {
            name: 'test10',
            items: '...',
            settings: '...',
            values: []
        },

        {
            name: 'test2',
            items: 'test2',
            settings: '...',
            values: ['w,','q','q' ]
        }
    },
]

Я пытался с вложенной картой внутри карты. становится грязным. заранее спасибо:)

Ответы [ 5 ]

2 голосов
/ 06 июня 2019

Используйте map и find.

let array1 = [{name:'test1',values:['a','b','c']},{name:'test2',values:['w,','q','q']}];
let array2 = [{name:'test1',items:'...',settings:'...',values:[]},{name:'test9',items:'...',settings:'...',values:[]},{name:'test10',items:'...',settings:'...',values:[]},{name:'test2',items:'test2',settings:'...',values:[]},];

const res = array2.map(e => {
  let found = array1.find(({ name }) => name == e.name);
  if (found) e.values = found.values;
  return e;
});

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
1 голос
/ 06 июня 2019

Вы также можете использовать filter и получить свой результат следующим образом:

let array1 = [{name:'test1',values:['a','b','c']},{name:'test2',values:['w,','q','q']}];
let array2 = [{name:'test1',items:'...',settings:'...',values:[]},{name:'test9',items:'...',settings:'...',values:[]},{name:'test10',items:'...',settings:'...',values:[]},{name:'test2',items:'test2',settings:'...',values:[]},];

var array2new = array2.filter(function(obj2) {
    return array1.filter(function(obj1) {
        if(obj1.name == obj2.name){
          return obj2.values.push(obj1.values);
        }else{return obj2;}
    });
});
console.log(array2new)
0 голосов
/ 06 июня 2019

Я бы также посоветовал вам использовать Массив # уменьшить метод:

let array1 = [{
    name: 'test1',
    values: ['a', 'b', 'c']
  },
  {
    name: 'test2',
    values: ['w,', 'q', 'q']
  }
]

let array2 = [{
    name: 'test1',
    items: '...',
    settings: '...',
    values: []
  },
  {
    name: 'test9',
    items: '...',
    settings: '...',
    values: []
  },

  {
    name: 'test10',
    items: '...',
    settings: '...',
    values: []
  },

  {
    name: 'test2',
    items: 'test2',
    settings: '...',
    values: []
  },
]

let arr = [...array2, ...array1].reduce((a,c) => {
	let filtered = a.filter(el => el.name === c.name);
	if(filtered.length){
		Object.assign(filtered[0], c);
	}else{
		a.push(c);
	}
	return a;
}, []);

console.log(JSON.stringify(arr));
0 голосов
/ 06 июня 2019

Вы можете взять Map и назначить найденные объекты конечному объекту в качестве результата.

var array1 = [{ name: 'test1', values: ['a', 'b', 'c'] }, { name: 'test2', values: ['w,', 'q', 'q'] }],
    array2 = [{ name: 'test1', items: '...', settings: '...', values: [] }, { name: 'test9', items: '...', settings: '...', values: [] }, { name: 'test10', items: '...', settings: '...', values: [] }, { name: 'test2', items: 'test2', settings: '...', values: [] }],
    map = new Map(array1.map(o => [o.name, o])),
    result = array2.map(o => Object.assign({}, o, map.get(o.name)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 06 июня 2019

Вы можете использовать reduce, чтобы решить эту проблему.

let array1 = [{
        name: 'test1',
        values: ['a', 'b', 'c']
    },
    {
        name: 'test2',
        values: ['w,','q','q' ]
    }
]

let array2 = [{
        name: 'test1',
        items: '...',
        settings: '...',
        values: []
    },
    {
        name: 'test9',
        items: '...',
        settings: '...',
        values: []
    },

    {
        name: 'test10',
        items: '...',
        settings: '...',
        values: []
    },

    {
        name: 'test2',
        items: 'test2',
        settings: '...',
        values: []
    },
]
const newArray2 = array2.reduce((newArray, currentObj) => {
  array1.forEach(baseObj => {
    if((baseObj.name == currentObj.name) && baseObj.values) {
      currentObj.values = baseObj.values;
    }
  })
  newArray.push(currentObj);
  return newArray;
}, [])

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