Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:比较数组元素属性,如果相同,则组合_Javascript_Arrays - Fatal编程技术网

Javascript:比较数组元素属性,如果相同,则组合

Javascript:比较数组元素属性,如果相同,则组合,javascript,arrays,Javascript,Arrays,我正在处理一系列对象。每个对象有两个属性:大小和计数 var drives = [ {size:"900GB", count:3}, {size:"900GB", count:100}, {size:"1200GB", count:5}, {size:"900GB", count:1} ] 我不喜欢同一个大小多次出现,我希望将所有重复的大小合并到一个数组索引中 首先,我将数组按大小排序。然后我试着做一个for循环来管理重复 drives.sort(function(obj1, obj2) {

我正在处理一系列对象。每个对象有两个属性:大小和计数

var drives = [
{size:"900GB", count:3},
{size:"900GB", count:100},
{size:"1200GB", count:5},
{size:"900GB", count:1}
]
我不喜欢同一个大小多次出现,我希望将所有重复的大小合并到一个数组索引中

首先,我将数组按大小排序。然后我试着做一个for循环来管理重复

drives.sort(function(obj1, obj2) {
var First = parseInt(obj1.size)
var Second = parseInt(obj2.size)
// Ascending: first size less than the previous
return First - Second;
})


for(var i = 0; i < drives.length-1; i++)
 {

    if(drives[i].size == drives[i+1].size)
     {
        drives[i+1].count+=drives[i].count; 
        //add the count of the first index to the second index's count
        drives.splice(i, 1); 
        //delete the first index
     }
 }          
drives.sort(功能(obj1、obj2){
var First=parseInt(obj1.size)
var Second=parseInt(obj2.size)
//升序:第一个大小小于上一个大小
返回第一秒;
})
对于(变量i=0;i


for循环似乎没有正确迭代。它只包含两个索引。我如何实现我所追求的目标?谢谢

您可以过滤数组并使用哈希表上的闭包更新相同大小的项

var驱动器=[{size:“900GB”,计数:3},{size:“900GB”,计数:100},{size:“1200GB”,计数:5},{size:“900GB”,计数:1}];
drives=drives.filter(函数(散列){
返回函数(a){
如果(!散列[a.size]){
散列[a.size]=a;
返回true;
}
散列[a.size]。count+=a.count;
};
}(Object.create(null));

控制台日志(驱动器)这可能不是最好的实现,但您始终可以保留一个临时元素列表并对其进行迭代:

var tmp = {};
var out = [];
for(var i = 0; i < drives.length; i++) {
    if(!tmp[JSON.stringify(drives[i])]) {
        out.push(drives[i]);
        tmp[JSON.stringify(drives[i])] = true;
    }
}
var tmp={};
var out=[];
对于(变量i=0;i
我所做的就是遍历数组,将对象转换为JSON,并将其用作对象中的键,因此如果存在任何相同的对象,它们将有望被捕获,因为它们存在于临时对象中(将查找保持在~O(1)处),stringify在循环中对键进行迭代)

如果尚未定义键,请将对象推送到新数组,然后继续推到原始数组的末尾


因此,最终的解决方案以O(n)运行,但内存效率不高。

编辑:使用
数组#过滤器可能会使其更短。感谢您使用此策略发布第一个答案。我使用的是
filter
函数的第二个参数,该函数将
这个
上下文设置为传递的回调,以使用尽可能少的额外行

var驱动器=[
{大小:“900GB”,计数:3},
{大小:“900GB”,计数:100},
{大小:“1200GB”,计数:5},
{大小:“900GB”,计数:1}
]
var结果=驱动器。过滤器(函数(e){
如果(此中的e.size)此[e.size].count+=e.count
否则返回此[e.size]=e
}, {})
console.log(结果)