Изменить свойство для всех объектов в массиве исключая один объект

У меня есть массив объектов areas:

areas:[
0: {
  "id_ou": 1,
  "lp": 1,
  "nazwa_ou": "Edukacja",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "EDU_ikona.PNG"
}
1:{
  "id_ou": 2,
  "lp": 2,
  "nazwa_ou": "Lokalna polityka społeczna",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "SPO_ikona.PNG"
}
2:{
  "id_ou": 3,
  "lp": 3,
  "nazwa_ou": "Kultura i rekreacja ",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "KUL_ikona.PNG"
}
3:{
  "id_ou": 4,
  "lp": 4,
  "nazwa_ou": "Drogownictwo i Transport",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": true,
  "plik_png": "DT _ikona.PNG"
}
4:{
  "id_ou": 5,
  "lp": 5,
  "nazwa_ou": "Ochrona środowiska",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": true,
  "plik_png": "OS _ikona.PNG"
}
5:{
  "id_ou": 6,
  "lp": 6,
  "nazwa_ou": "Gospodarowanie nieruchomościami",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": true,
  "plik_png": "GN _ikona.PNG"
}
6:{
  "id_ou": 7,
  "lp": 7,
  "nazwa_ou": "Inwestycje i budownictwo",
  "nazwa_ou_ang": "",
  "czy_domyslny": true,
  "czy_aktywny": true,
  "plik_png": "IB _ikona.PNG"
}
7:{
  "id_ou": 8,
  "lp": 8,
  "nazwa_ou": "Geodezja i kartografia",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "GK _ikona.PNG"
}
8:{
  "id_ou": 9,
  "lp": 9,
  "nazwa_ou": "Podatki i opłaty lokalne",
  "nazwa_ou_ang": "",
  "czy_domyslny": true,
  "czy_aktywny": true,
  "plik_png": "POL_ikona.PNG"
}]

Я в React устанавливаю selectedTab , например "Geodezja i kartografia" как выбранный объект и меняю в нем свойство "czy_domyslny": true, и получаю новый массив с измененным свойством этого объекта:

areas:[
0: {
  "id_ou": 1,
  "lp": 1,
  "nazwa_ou": "Edukacja",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "EDU_ikona.PNG"
}
1:{
  "id_ou": 2,
  "lp": 2,
  "nazwa_ou": "Lokalna polityka społeczna",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "SPO_ikona.PNG"
}
2:{
  "id_ou": 3,
  "lp": 3,
  "nazwa_ou": "Kultura i rekreacja ",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "KUL_ikona.PNG"
}
3:{
  "id_ou": 4,
  "lp": 4,
  "nazwa_ou": "Drogownictwo i Transport",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": true,
  "plik_png": "DT _ikona.PNG"
}
4:{
  "id_ou": 5,
  "lp": 5,
  "nazwa_ou": "Ochrona środowiska",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": true,
  "plik_png": "OS _ikona.PNG"
}
5:{
  "id_ou": 6,
  "lp": 6,
  "nazwa_ou": "Gospodarowanie nieruchomościami",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": true,
  "plik_png": "GN _ikona.PNG"
}
6:{
  "id_ou": 7,
  "lp": 7,
  "nazwa_ou": "Inwestycje i budownictwo",
  "nazwa_ou_ang": "",
  "czy_domyslny": true,
  "czy_aktywny": true,
  "plik_png": "IB _ikona.PNG"
}
7:{
  "id_ou": 8,
  "lp": 8,
  "nazwa_ou": "Geodezja i kartografia",
  "nazwa_ou_ang": "",
  "czy_domyslny": true,
  "czy_aktywny": false,
  "plik_png": "GK _ikona.PNG"
}
8:{
  "id_ou": 9,
  "lp": 9,
  "nazwa_ou": "Podatki i opłaty lokalne",
  "nazwa_ou_ang": "",
  "czy_domyslny": true,
  "czy_aktywny": true,
  "plik_png": "POL_ikona.PNG"
}]

Теперь мне нужно перебрать полученный измененный массив areas и изменить в нем все свойства "czy_domyslny": true, на "czy_domyslny": false, исключая выбранный в массиве selectedTab.

Как это лучше сделать? через forEach исключая id_ou выбранного мной обьекта selectedTab?


Ответы (1 шт):

Автор решения: xydope

let arr = [{
  "id_ou": 1,
  "lp": 1,
  "nazwa_ou": "Edukacja",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "EDU_ikona.PNG"
}, {
  "id_ou": 2,
  "lp": 2,
  "nazwa_ou": "Lokalna polityka społeczna",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "SPO_ikona.PNG"
}, {
  "id_ou": 3,
  "lp": 3,
  "nazwa_ou": "Kultura i rekreacja ",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "KUL_ikona.PNG"
}, {
  "id_ou": 4,
  "lp": 4,
  "nazwa_ou": "Drogownictwo i Transport",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": true,
  "plik_png": "DT _ikona.PNG"
}, {
  "id_ou": 5,
  "lp": 5,
  "nazwa_ou": "Ochrona środowiska",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": true,
  "plik_png": "OS _ikona.PNG"
}, {
  "id_ou": 6,
  "lp": 6,
  "nazwa_ou": "Gospodarowanie nieruchomościami",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": true,
  "plik_png": "GN _ikona.PNG"
}, {
  "id_ou": 7,
  "lp": 7,
  "nazwa_ou": "Inwestycje i budownictwo",
  "nazwa_ou_ang": "",
  "czy_domyslny": true,
  "czy_aktywny": true,
  "plik_png": "IB _ikona.PNG"
}, {
  "id_ou": 8,
  "lp": 8,
  "nazwa_ou": "Geodezja i kartografia",
  "nazwa_ou_ang": "",
  "czy_domyslny": false,
  "czy_aktywny": false,
  "plik_png": "GK _ikona.PNG"
}, {
  "id_ou": 9,
  "lp": 9,
  "nazwa_ou": "Podatki i opłaty lokalne",
  "nazwa_ou_ang": "",
  "czy_domyslny": true,
  "czy_aktywny": true,
  "plik_png": "POL_ikona.PNG"
}]

let selectedTab = 'Geodezja i kartografia' //условно, это стейт реакта

//принимает исходный массив и то, что должно быть активным
let domyslnySwitch = (data, active) => {
  return data.map((item) => //используем Array.map для перебора массива
    (item.nazwa_ou == active) //если название элемента совпадает с тем, что должен быть активным
    ? item //ничего не делаем, возвращаем элемент массива.
    : { ...item, czy_domyslny: false } //в противном случае, с флагом false
  )
}

//Пример через forEach
let domyslnySwitchForEach = (data, active) => {
  let newData = []; //новый массив
  
  data.forEach((item)=>{
    if(item.nazwa_ou == active) //если имя совпадает
       newData.push(item) //то пушим в новый массив элемент без изменений 
    else //если нет
      newData.push({...item, czy_domyslny: false}) //изменяем св-во и пушим в новый массив
      //надеюсь, вы знакомы с деструктуризацией
  })
  
  return newData; //ф-я возвращает новый массив
}




let newArr = domyslnySwitch(arr, selectedTab); //вызываем ф-ю

console.log(newArr)

→ Ссылка