计算并删除 JavaScript 数组中的重复项
Count and delete duplicates in javascript array
我有一个正整数数组。有些是独一无二的,有些是重复的。我正在尝试制作一个函数来计算重复项的数量并将其与相关数字配对。
例如,如果我有这个数组开始:
arr = [89, 1, 1, 2, 89, 89];
我正在尝试将其作为结果:
res = [
{"id" : 1, "count" : 2 },
{"id" : 2, "count" : 1 },
{"id" : 89, "count" : 3 }
];
这是我编造的功能,但它不起作用,我觉得有一个更好的解决方案:
function cons_dupes(arr) {
//Consolidate duplicates by deleting everything but one of each.
//Also adds a count of total duplicates with each index.
var out = {};
for (i=0;i<arr.length;i++)
{
if (arr[i] !== 'null')
{
out[i] = {
data: arr[i],
count: 1
};
for (ii=0; ii<arr.length; ii++)
{
if (arr[i]==arr[ii])
{
arr[ii] = 'null';
out[i].count++;
}
}
}
else
{
console.log('null value: arr['+ii+']');
}
}
return out;
}
任何帮助将不胜感激!
您可能希望分两步执行此操作:1) 创建一个包含每个 id 计数的对象,然后 2) 创建最终的对象数组。 例如:
var a = [89, 1, 1, 2, 89];
var counts = {};
var final = [];
for (var i = 0; i < a.length; i++) {
if(counts[a[i]] != undefined) {
counts[a[i]] = 1;
} else {
counts[a[i]]++;
}
}
for (var num in counts) {
final.push({'id': num, 'count': counts[num]});
}
// final has what you want here
请注意您的for (ii=0; ii<arr.length; ii++)
这是不正确的,因为您不应该计算arr[i] == arr[i]
。将此行更改为 for (ii=i + 1; ii<arr.length; ii++)
将使函数正常工作。
这是我的解决方案:
function cons_dupes(arr) {
var p = {};
arr.forEach(function (x) { p[x] = (p[x] || 0) + 1; });
return Object.keys(p).map(function (x) { return { id: x, count: p[x] }; });
}
主题中有"计算和删除 javascript 数组中的重复项",但您在问题正文中没有提到删除。您应确保问题正文完整,不依赖于标题中的信息,并且标题与正文匹配。
这里的大多数答案都不会删除重复项。
无论如何,假设您希望成员计数并删除重复项,则可以执行以下操作:
// Removes duplicates from an array and returns an object
// with a count of the members
function removeDupes(arr) {
var result = {};
var i = arr.length;
while (i--) {
// If member is a duplicate, increment count and delete it
if (result.hasOwnProperty(arr[i])) {
result[arr[i]]++;
arr.splice(i, 1);
// Otherwise, just add it to the results
} else {
result[arr[i]] = 1;
}
}
// convert results to the desired object format
return Object.keys(result).map(function (p){return {id: p, count: result[p]};});
}
如果您
不介意使用 http://underscorejs.org/,这里有一个简单的解决方案:
_.map(_.groupBy(arr), function(value, key) {
return {
id: key,
count: value.length
}
});
arr = [89, 1, 1, 2, 89, 89];
arr.sort();//it alters the orignal array. so beware
var newArr = [];
var count = 1;
for (i = 0; i<arr.length; i++){
if(arr[i] == arr[i+1]){
count ++;
continue;
} else {
newArr.push({
id: arr[i],
count: count
});
count = 1;
}
}
alert(JSON.stringify(newArr));//newArr holds the data u want
我会做这样的事情。但一定有更好的答案
相关文章:
- 从组件状态的数组中删除元素
- Mongoose-在更新中删除数组元素
- 从数组中删除元素的最佳方法是:javascript/jquery
- 添加和删除隐藏字段数组中的值,而不提交表单
- 从数组中删除重复条目,并在javascript中按顺序排列
- 一些元素没有从数组中删除
- 删除JS数组中的最小数字
- 从数组中删除三元组项
- 删除重复的数组值,然后存储它们[反应]
- 在特定索引处剥离/删除数组中的值
- 数组删除重复结果Javascript
- 字符串替换或通过数组删除
- js中的对象数组:删除重复项
- KnockoutJS.Mapping.FromJS-可观察数组-删除不起作用
- 用于垃圾收集的Javascript数组删除
- 为什么”——数组.删除数组的最后一个元素
- PHP循环通过脚本数组&删除项目
- 谷歌地图API:试图使用数组删除多个标记
- 带有for循环+条件的Javascript数组删除不必要的元素
- 在JavaScript中管理像ArrayList这样的数组:删除一个元素并关闭创建的间隙