У меня есть два массива selectedData и все allServices

 selectedData = [ { id: 5 }, { id: 6 } ]; allServices = [ { id: 3, selected: false }, { id: 4, selected: false }, { id: 5, selected: false }, { id: 6, selected: false }, { id: 7, selected: false }, ]; 

Я использую функцию для сравнения и изменения структуры allServices .

 const changeStructure = (selectedData, allServices) ={amp}gt; { selectedData.services.map((_item, index) ={amp}gt; { allServices.map((value, i) ={amp}gt; { if (value.id === _item.id) { allServices[i].selected = true; } else { allServices[i].selected = false; } }) }) console.log('final allServices', allServices); return allServices; } 

console.log final allServices is

 [ { id: 3, selected: false }, { id: 4, selected: false }, { id: 5, selected: false }, { id: 6, selected: true }, { id: 7, selected: false }, ]; 

Я думал, что все мои allServices должны быть

 [ { id: 3, selected: false }, { id: 4, selected: false }, { id: 5, selected: true }, { id: 6, selected: true }, { id: 7, selected: false }, ]; 

Я понятия не имею, почему это происходит. Любое предложение будет оценено.

Вам нужно удалить блок else из вашего кода, который обновляет предыдущие идентификаторы на false при несовпадении.

 const changeStructure = (selectedData, allServices) ={amp}gt; { selectedData.services.map((_item, index) ={amp}gt; { allServices.map((value, i) ={amp}gt; { if (value.id === _item.id) { allServices[i].selected = true; } }) }) console.log('final allServices', allServices); return allServices; } 

Ваша проблема в том, что каждый раз, когда вы перебираете свой массив selectedData с помощью внешнего .map() вы меняете все идентификаторы элементов, которые вы ранее установили на true обратно на false . Вместо этого вы должны использовать .map() , возвращая новый элемент при каждой итерации. Это можно сделать эффективно, создав new Set всех идентификаторов, которые есть в selectedData и изменив selected свойство в зависимости от того, установлен ли set .has() id текущего объекта:

 const selectedData = [ { id: 5 }, { id: 6 } ]; const allServices = [ { id: 3, selected: false }, { id: 4, selected: false }, { id: 5, selected: false }, { id: 6, selected: false }, { id: 7, selected: false } ]; const lut = new Set(selectedData.map(({id}) ={amp}gt; id)); const res = allServices.map(({id, ...rest}) ={amp}gt; ({id, ...rest, selected: lut.has(id)})); console.log(res); 

Там нет перерывов. Вы проверяете все возможные пары и присваиваете allServices[i].selected один раз для каждого значения в selectedData . Поэтому allServices[3].selected присваивается значение false и снова значение false ; allServices[6].selected присваивается значение false , затем true ; но allServices[5].selected присваивается значение true , а затем перезаписывается значением false .

Вы бы хотели, чтобы петли поменялись местами, чтобы из них можно было разорвать внутреннюю. Еще лучше, используйте some .

 const changeStructure = (selectedData, allServices) ={amp}gt; { allServices.forEach(value ={amp}gt; { value.selected = selectedData.some(selected ={amp}gt; selected.id == value.id) }) console.log('final allServices', allServices); return allServices; } 

Вы можете сделать цикл с allServices и сравнить id в каждом элементе с id элементов в selectedData используя forEach . Как это:

 var selectedData = [ { id: 5 }, { id: 6 } ]; var allServices = [ { id: 3, selected: false }, { id: 4, selected: false }, { id: 5, selected: false }, { id: 6, selected: false }, { id: 7, selected: false }, ]; allServices.forEach(x ={amp}gt; x.selected = selectedData.find(a ={amp}gt; a.id === x.id) !== undefined); console.log(allServices); 

Он будет учитывать только последний элемент в массиве selectedData потому что каждый набор значений selected: true сбрасывается блоком else .

Другой вариант — создать Set всех id из selectedData . allServices и обновите selected значение в зависимости от того, has ли Set текущий id объекта

 const selectedData=[{id:5},{id:6}], allServices=[{id:3,selected:false},{id:4,selected:false},{id:5,selected:false},{id:6,selected:false},{id:7,selected:false},]; const set = new Set(selectedData.map(o ={amp}gt; o.id)); allServices.forEach(o ={amp}gt; o.selected = set.has(o.id)) console.log(allServices) 

Можете ли вы попробовать простой код:

 const selectedData = [ { id: 5 }, { id: 6 } ]; const allServices = [ { id: 3, selected: false }, { id: 4, selected: false }, { id: 5, selected: false }, { id: 6, selected: false }, { id: 7, selected: false } ]; const res = allServices.map(service ={amp}gt; ({...service , selected: selectedData.findIndex(selected ={amp}gt; selected.id === service.id) {amp}gt;-1 })); console.log(res); 

Вот мое решение. Это выглядит довольно просто.

 const changeStructure = (selectedData, allServices) ={amp}gt; { allServices.forEach(item ={amp}gt; { item.selected = selectedData.some(sel ={amp}gt; sel.id === item.id); }); console.log('final allServices', allServices); return allServices; }