数组组装,求大佬指导?
let arrayData = [ {
name: 'k1',
percentage: '0%'
},
{
name: 'k2',
percentage: '0%'
},
{
name: 'k3',
percentage: '1%'
},
{
name: 'k4',
percentage: '2%'
},
{
name: 'k5',
percentage: '0%'
},
{
name: 'k6',
percentage: '3%'
}
]
我想要的结果:相同进度的不要叠加一起,让它往前走一格,第2个0%让它往前走+1变成1%,第3个0%让它往前走2格+2变成2%,若1%,2%已存在,在前面的基础2%,加+1,变成3%,4%,以此类推!
备注:一般只有0%和100%才会出现多个相同的,最多4个相同的数据
newArrayData = [ {
name: 'k1',
percentage: '0%'
},
{
name: 'k2',
percentage: '1%'
},
{
name: 'k5',
percentage: '2%'
},
{
name: 'k3',
percentage: '3%'
},
{
name: 'k4',
percentage: '4%'
},
{
name: 'k6',
percentage: '5%'
}
]
回答:
let arrayData = [ {
name: "k1",
percentage: "0%",
},
{
name: "k2",
percentage: "0%",
},
{
name: "k3",
percentage: "1%",
},
{
name: "k4",
percentage: "2%",
},
{
name: "k5",
percentage: "0%",
},
{
name: "k6",
percentage: "3%",
},
{
name: "k7",
percentage: "11%",
},
{
name: "k8",
percentage: "3%",
},
{
name: "k9",
percentage: "3%",
},
{
name: "k10",
percentage: "3%",
},
];
let list = [];
arrayData.forEach((item) => {
let count = item.percentage.replace("%", "");
if (!list[count]) {
list[count] = count;
} else {
let newCount = list.findIndex((el) => el === undefined);
if (newCount < 0) {
newCount = list.length;
}
item.percentage = newCount + "%";
list[newCount] = newCount;
}
});
console.log(arrayData);
回答:
来个又短又快的
let arrayData = [ {
name: 'k1',
percentage: '0%'
},
{
name: 'k2',
percentage: '0%'
},
{
name: 'k3',
percentage: '1%'
},
{
name: 'k4',
percentage: '2%'
},
{
name: 'k5',
percentage: '0%'
},
{
name: 'k6',
percentage: '3%'
}
]
arrayData
.sort((a, b) => parseInt(a.percentage) - parseInt(b.percentage))
.reduce((min, it) => {
if (parseInt(it.percentage) <= min) {
it.percentage = `${min + 1}%`;
return min + 1;
}
return parseInt(it.percentage);
}, -1);
console.log(arrayData)
/*
[
{
"name": "k1",
"percentage": "0%"
},
{
"name": "k2",
"percentage": "1%"
},
{
"name": "k5",
"percentage": "2%"
},
{
"name": "k3",
"percentage": "3%"
},
{
"name": "k4",
"percentage": "4%"
},
{
"name": "k6",
"percentage": "5%"
}
]
*/
回答:
从问题和示例结果分析,题主是想先处理所有 0%,再处理所有 1% …… 这样的话,只需要按 percentage 稳定排序再重新递增赋值即可
const result = arrayData // 先把 percentage 算成用于排序的权值,
// 因为万一有 12 % 这种情况,按字符串排序会不符合预期
.map(it => ({ it, weight: parseInt(it.percentage) }))
// 按权值排序,会把所有 percentage 从小到大排列
.sort(({ weight: a }, { weight: b }) => a - b)
// 重新按顺序赋 percentage 递增值即可
.map(({ it }, i) => {
it.percentage = `${i}%`;
return it;
});
注意
sort()
从 ECMAScript 2019 之后为稳定排序,之前不是。如果要在任何场景下保证稳定,需要自己写个排序。- 只适用于所有 percentage 最终一定连续的情况,比如示例数据(共 6 项)中有任何一个 percentage 值超过 6%(不含),可能得不到预期,这种情况需要更复杂一点的算法来跳过空进度。
回答:
let arrayData = [ {
name: "k1",
percentage: "0%",
},
{
name: "k2",
percentage: "0%",
},
{
name: "k3",
percentage: "1%",
},
{
name: "k4",
percentage: "2%",
},
{
name: "k5",
percentage: "0%",
},
{
name: "k6",
percentage: "3%",
},
];
let obj = {};
// 首先处理非0%和100%的情况
arrayData.forEach((item, index) => {
if (item.percentage !== "0%" && item.percentage !== "100%") {
let count = obj[item.percentage] || 0;
obj[item.percentage] = count + 1;
let newP = parseInt(item.percentage) + count;
arrayData[index].percentage = newP + "%";
}
});
// 处理0%的情况
let count = 0;
arrayData.forEach((item, index) => {
if (item.percentage === "0%") {
arrayData[index].percentage = count + "%";
count++;
}
});
console.log(arrayData);
回答:
let arrayData = [ {
name: 'k1',
percentage: '0%',
},
{
name: 'k2',
percentage: '0%',
},
{
name: 'k3',
percentage: '1%',
},
{
name: 'k4',
percentage: '2%',
},
{
name: 'k5',
percentage: '0%',
},
{
name: 'k6',
percentage: '3%',
},
];
arrayData = arrayData
.sort((a, b) => {
return parseInt(a.percentage) - parseInt(b.percentage);
})
.reduce((total, current, index, arr) => {
if (index === 0) {
total.push(current);
return total;
}
const last = total[total.length - 1];
const item = { ...current };
const next = arr[index + 1];
if (last.percentage === current.percentage) {
item.percentage = `${parseInt(item.percentage) + 1}%`;
if (next && next.percentage === current.percentage) {
next.percentage = `${parseInt(item.percentage) + 1}%`;
}
}
if (parseInt(item.percentage) < parseInt(last.percentage)) {
item.percentage = `${parseInt(last.percentage) + 1}%`;
}
total.push(item);
return total;
}, []);
console.log(arrayData);
回答:
let arr = [ { name: "k1", percentage: "0%" },
{ name: "k2", percentage: "0%" },
{ name: "k3", percentage: "1%" },
{ name: "k4", percentage: "2%" },
{ name: "k5", percentage: "0%" },
{ name: "k6", percentage: "3%" },
];
const getSort = (arr) => {
const getNum = (n) => n.replace("%", "") - 0;
arr.sort((a, b) => {
return getNum(a.percentage) - getNum(b.percentage);
});
let baseInfo = null;
arr.map((e, index) => {
e.percentage = getNum(e.percentage);
const getBaseNum = () => {
if (e.percentage != baseInfo) {
baseInfo = e.percentage;
}
return baseInfo;
};
if (e.percentage === getBaseNum() && arr[index - 1] != undefined) {
e.percentage = arr[index - 1].percentage + 1;
}
if (e.percentage < getBaseNum()) {
e.percentage = getBaseNum() + 1;
}
return e;
})
.map((e) => (e.percentage += "%"));
};
getSort(arr);
console.log(arr, " arr");
回答:
let currentNum = -1; const newArrData = arrayData.map((item) => {
const num = Number(item.percentage.split('%')[0]);
currentNum += 1;
if (num === currentNum) {
return item;
}
return { ...item, percentage: `${currentNum}%` };
});
回答:
我觉得题主还是需要进一步厘清需求,才来寻求具体算法。
- 数据是否需要按
name
排序? - 数据是否需要最终实现
percentage
的递增? - 数据来源是什么?只是对这一点数据的处理,还是后面会遇到更多的动态产生的数据,或者说数据是变化的,这里只是一个例子?
- 所谓的
0%
和100%
有相同,是具体什么限定条件?
...
总之,我觉得题主很多还没有考虑到,需要厘清的。
以上是 数组组装,求大佬指导? 的全部内容, 来源链接: utcz.com/p/935278.html