在我的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;
答案 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)