如何保留每组记录中包含最大ID的属性值?

时间:2017-03-23 07:41:15

标签: javascript

在我的Regions数组中有3条记录,其中selected属性为true 14.3,14.2,11.1

我正在尝试为所选属性为true的每个部分的所有较低版本的selected属性设置为false。

例如:选择14.3和14.2,14.3的id大于14.2因此对于part = 30,14.2的选定属性应设置为false,因为它是选定的14.3和14.2的part = 30的较低版本。

如果我谈论11.1,更高版本将是11.1,因为11.2高于11.1未被选中,因此11.1的选定属性将仅为真。

预期输出:

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",
                 }
            ];

因此,对于每个部分,我都没有得到如何将所选属性保留为最大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)
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:2)

您可以遍历数组两次:

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;
}

答案 1 :(得分:1)

您可以使用reduce等数组方法(构建从part到最大选定id的地图)和forEach(更新selected来执行此操作每个区域的值取决于它是否具有最大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)