我有一组对象:
const data = [
{ position: 1, name: "a", score: 9000 },
{ position: 2, name: "b", score: 8000 },
{ position: 3, name: "c", score: 6000 },
{ position: 3, name: "c", score: 6000 },
{ position: 4, name: "d", score: 6000 },
{ position: 5, name: "e", score: 6000 },
{ position: 6, name: "f", score: 6000 },
{ position: 7, name: "g", score: 4000 },
{ position: 8, name: "h", score: 3000 },
{ position: 9, name: "i", score: 2500 },
{ position: 10, name: "j", score: 2500 },
{ position: 11, name: "k", score: 1000 },
{ position: 12, name: "l", score: 1000 },
];
我试图只使用简单的JavaScript来迭代它,以获得以下结果:
const data = [
{ position: "1", name: "a", score: 9000 },
{ position: "2", name: "b", score: 8000 },
{ position: "3-6", name: "c", score: 6000 },
{ position: "3-6", name: "c", score: 6000 },
{ position: "3-6", name: "d", score: 6000 },
{ position: "3-6", name: "e", score: 6000 },
{ position: "3-6", name: "f", score: 6000 },
{ position: "7", name: "g", score: 4000 },
{ position: "8", name: "h", score: 3000 },
{ position: "9-10", name: "i", score: 2500 },
{ position: "9-10", name: "j", score: 2500 },
{ position: "11-12", name: "k", score: 1000 },
{ position: "11-12", name: "l", score: 1000 },
];
我尝试过很多不同的方法,但不幸的是,没有任何效果。有什么窍门可以实现吗?提前谢谢。
这可能是我得到的最接近的
function placement() {
let repeat=0;
for (let i = 0; i < data.length; i++) {
let counter = 0;
for (let j = 0; j < data.length; j++) {
if (data[i].score == data[j].score) {
if(data[i].position==data[j].position){
repeat++;
}
counter++;
}
}
if (counter > 1) {
let k;
let start=data[i].position;
for (k = i; k < i + counter-1; k++) {
data[k].position =
start + "-" + data[i + counter-1].position;
}
i=k;
}
}
}
发布于 2021-08-23 21:18:36
您可以先按score
分组,然后添加每个组的位置。
const
data = [{ position: 1, name: "a", score: 9000 }, { position: 2, name: "b", score: 8000 }, { position: 3, name: "c", score: 6000 }, { position: 3, name: "c", score: 6000 }, { position: 4, name: "d", score: 6000 }, { position: 5, name: "e", score: 6000 }, { position: 6, name: "f", score: 6000 }, { position: 7, name: "g", score: 4000 }, { position: 8, name: "h", score: 3000 }, { position: 9, name: "i", score: 2500 }, { position: 10, name: "j", score: 2500 }, { position: 11, name: "k", score: 1000 }, { position: 12, name: "l", score: 1000 }],
result = data
.reduce((r, o, i, a) => {
if (!i || a[i - 1].score !== o.score) r.push([]);
r[r.length - 1].push(o);
return r;
}, [])
.flatMap(a => a.map((o, i, b) => b.length === 1
? o
: { ...o, position: `${b[0].position}-${b[b.length - 1].position}` }
));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
发布于 2021-08-23 21:15:47
假设data
中的项按分数排序,即将范围压缩为每个值的一个实例,则可以执行以下操作:
Array#reduce
对数组进行迭代,同时更新以score
为键的Map
,并以开始和结束positions
作为值。然后,Array#map
再次遍历数组,对于每个项,将位置设置为保存在地图中的值:H 210G 211
const data = [
{ position: 1, name: "a", score: 9000 },
{ position: 2, name: "b", score: 8000 },
{ position: 3, name: "c", score: 6000 },
{ position: 3, name: "c", score: 6000 },
{ position: 4, name: "d", score: 6000 },
{ position: 5, name: "e", score: 6000 },
{ position: 6, name: "f", score: 6000 },
{ position: 7, name: "g", score: 4000 },
{ position: 8, name: "h", score: 3000 },
{ position: 9, name: "i", score: 2500 },
{ position: 10, name: "j", score: 2500 },
{ position: 11, name: "k", score: 1000 },
{ position: 12, name: "l", score: 1000 },
];
const scoreMap = data.reduce((map, { position, score }) => {
const { start } = map.get(score) || {};
if(start) (map.get(score)).end = position;
else map.set(score, { start: position });
return map;
}, new Map);
const res = data.map(e => {
const { start, end } = scoreMap.get(e.score);
return { ...e, position: end ? `${start}-${end}` : `${start}` };
});
console.log(res);
https://stackoverflow.com/questions/68898921
复制相似问题