简体   繁体   中英

How to preserve value of property with max id from each group of record?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM