数组组装,求大佬指导?

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;

});

注意

  1. sort() 从 ECMAScript 2019 之后为稳定排序,之前不是。如果要在任何场景下保证稳定,需要自己写个排序。
  2. 只适用于所有 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}%` };

});


回答:

我觉得题主还是需要进一步厘清需求,才来寻求具体算法。

  1. 数据是否需要按name排序?
  2. 数据是否需要最终实现percentage的递增?
  3. 数据来源是什么?只是对这一点数据的处理,还是后面会遇到更多的动态产生的数据,或者说数据是变化的,这里只是一个例子?
  4. 所谓的0%100%有相同,是具体什么限定条件?

...

总之,我觉得题主很多还没有考虑到,需要厘清的。

以上是 数组组装,求大佬指导? 的全部内容, 来源链接: utcz.com/p/935278.html

回到顶部