In my regions array there are 3 records with selected property as true ie 14.3,14.2,11.1
.
I am trying to set selected property to false for all lower version for each of the part whose selected property is true.
For example: 14.3 and 14.2 are selected and id of 14.3 is greater than 14.2 so for part = 30,selected property of 14.2 should be set to false as because it is lower version for part =30 from selected 14.3 and 14.2.
If I talk about 11.1,higher version would be 11.1 only because 11.2 which is higher that 11.1 is not selected so selected property of 11.1 will remains true only.
Expected Output :
var regions = [
{
"id": 77,
"selected": false,
"part": 33,
"name": "16.1",
},
{
"id": 76,
"part": 30,
"selected": true,
"name": "14.3",
},
{
"id": 71,
"part": 30,
"selected": false,
"name": "14.2",
},
{
"id": 70,
"part": 31,
"selected": false,
"name": "15.1",
},
{
"id": 54,
"part": 25,
"selected": false,
"name": "11.2",
}
,
{
"id": 53,
"part": 25,
"selected": true,
"name": "11.1",
}
];
So for each part I am not getting how to preserve selected property to true for max id.
var regions = [ { "id": 77, "selected": false, "part": 33, "name": "16.1", }, { "id": 76, "part": 30, "selected": true, "name": "14.3", }, { "id": 71, "part": 30, "selected": true, "name": "14.2", }, { "id": 70, "part": 31, "selected": false, "name": "15.1", }, { "id": 54, "part": 25, "selected": false, "name": "11.2", } , { "id": 53, "part": 25, "selected": true, "name": "11.1", } ]; var obj = { "id": 70,"part": 31, "selected": true,"name": "15.1" }; for (var i = 0; i < regions.length; i++) { if ((regions[i].part != obj.part && regions[i].selected)) { regions[i].selected = false; //this set 14.3 and 11.1 selected to false. } } console.log(regions)
You could iterate through the array twice:
var maxes = {};
// keep track of the max value associated with each id
for (var i = 0; i < regions.length; i++) {
var id = regions[i].part;
if (typeof maxes[id] === 'undefined')
maxes[id] = +regions[i].name;
else maxes[id] = Math.max(maxes[id], +regions[i].name);
}
// set the max to be true and all others to be false
for (var i = 0; i < regions.length; i++) {
if (+regions[i].name === maxes[regions[i].part])
regions[i].selected = true;
else
regions[i].selected = false;
}
You can do this using Array methods like reduce
(to build a map from part
s to maximum selected id
) and forEach
(to update the selected
values of each region depending on whether it has the maximum id
).
var regions = [{ "id": 77, "selected": false, "part": 33, "name": "16.1", }, { "id": 76, "part": 30, "selected": true, "name": "14.3", }, { "id": 71, "part": 30, "selected": true, "name": "14.2", }, { "id": 70, "part": 31, "selected": false, "name": "15.1", }, { "id": 54, "part": 25, "selected": false, "name": "11.2", }, { "id": 53, "part": 25, "selected": true, "name": "11.1", } ] var map = regions.reduce(function (map, e) { if (e.selected) map[e.part] = Math.max(map[e.part] || 0, e.id) return map }, {}) console.log(map) regions.forEach(function (e) { if (e.part in map) e.selected = e.id === map[e.part] }) console.log(regions)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.