我有一个包含重复项的数组
array = ["String 1", "string 2", "STRING 1", "String 2", "String 3", "String 1"]
我想摆脱重复项(不区分大小写)并创建一个新数组来计算重复项。
在其中一个答案中,我看到了这个函数:
function count_array(arr) {
var a = [], b = [], prev;
arr.sort();
for ( var i = 0; i < arr.length; i++ ) {
if ( arr[i] !== prev ) {
a.push(arr[i]);
b.push(1);
} else {
b[b.length-1]++;
}
prev = arr[i];
}
return [a, b];
}
返回两个数组:
First array: ["String 1", "String 2", "STRING 1", "String 3"]
Second array: [2, 2, 1, 1]
如果不区分大小写,我希望 String 1, STRING 1, string 1, StRING 1
的所有实例都被视为 String 1
。
对于大型数组还有更好的方法吗?例如数组长度为 10K?
最佳答案
将字符串数组缩减为对象,使用字符串作为键,使用出现次数作为值。使用 Object.keys()
获取第一个数组,使用 Object.values()
获取第二个数组:
const array = ["String 1", "string 2", "STRING 1", "String 2", "String 3", "String 1"]
const counts = array.reduce((r, s) => {
const key = s[0].toUpperCase() + s.substring(1).toLowerCase();
r[key] = (r[key] || 0) + 1;
return r;
}, {});
const first = Object.keys(counts);
const second = Object.values(counts);
console.log(first);
console.log(second);
要获得按重复项数量排序的结果,请使用Object.entries()
将reduce 结果转换为对数组。按第二个值(计数)排序。要获取两个数组,请使用 Array.map()。
const array = ["String 1", "string 2", "STRING 1", "String 2", "String 3", "String 1"]
const counts = Object.entries(array.reduce((r, s) => {
const key = s[0].toUpperCase() + s.substring(1).toLowerCase();
r[key] = (r[key] || 0) + 1;
return r;
}, {}))
.sort(([, a], [, b]) => b - a);
const first = counts.map(([s]) => s);
const second = counts.map(([, n]) => n);
console.log(first);
console.log(second);
关于javascript - 快速计算和删除数组中重复项的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54839677/