Изменить свойство для всех объектов в массиве исключая один объект
У меня есть массив объектов 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)