Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Underscore.js_Lodash - Fatal编程技术网

Javascript 合并数组并合并值

Javascript 合并数组并合并值,javascript,arrays,underscore.js,lodash,Javascript,Arrays,Underscore.js,Lodash,我正在尝试组合一个对象数组,同时根据特定值删除重复项,在本例中是id。我想合并每个对象中的其他属性 这就是我所拥有的: var myArray = [ { id : 1, rendering : 0, completed : 1 }, { id : 2, rendering : 0, completed : 1 }, { id : 3,

我正在尝试组合一个对象数组,同时根据特定值删除重复项,在本例中是
id
。我想合并每个对象中的其他属性

这就是我所拥有的:

var myArray = [
    {
        id : 1,
        rendering : 0,
        completed : 1
    },
    {
        id : 2,
        rendering : 0,
        completed : 1
    },
    {
        id : 3,
        rendering : 0,
        completed : 1
    },
    {
        id : 1,
        rendering : 1,
        completed : 0
    },
    {
        id : 2,
        rendering : 1,
        completed : 0
    },
    {
        id : 3,
        rendering : 1,
        completed : 0
    },
]
这就是我想要的:

var myDesiredArray = [
    {
        id : 1,
        rendering: 1,
        completed: 1
    },
    {
        id : 2,
        rendering: 1,
        completed: 1
    },
    {
        id : 3,
        rendering: 1,
        completed: 1
    },
]

我很乐意直接使用javascript或下划线/lodash。如有任何建议,将不胜感激

纯JS解决方案

您应该做的第一件事是使用地图进行快速查找:

var map = {};
myArray.forEach(function(item){
  var mapItem = map[item.id] || {
    id : item.id,
    rendering : 0,
    completed : 0
  }
  mapItem.rendering += item.rendering;
  mapItem.completed += item.completed;
  map[item.id] = mapItem;
});
然后可以将贴图转换回数组:

var myDesiredArray = [];
for (var id in map) {
  myDesiredArray.push(map[id]);
}

下面是另一个使用函数方法的vanilla js版本:

myArray.reduce(function(prev, cur) {
  if (prev[cur.id]) {
    prev[cur.id].rendering += cur.rendering;
    prev[cur.id].completed += cur.completed;
  } else {
    prev[cur.id] = cur;
  }
  return prev;
}, []).filter(function(val) {
  return val;
});
函数合并(arr){
var uniqItems=arr.reduce(功能(备忘录,项目){
如果(!备注[item.id]){
备注[项目id]=项目;
}否则{
Object.key(item).forEach(函数(k){
如果(项[k]){memo[item.id][k]=项[k];}
});
}
返回备忘录;
}, {});
返回Object.keys(uniqItems).map(函数(k){
返回uniqItems[k];
});
}
合并(myArray);//=>myDesiredArray

使用下划线,这里有一种方法

定义一个
sum
函数

function sum(numbers) {
    return _.reduce(numbers, function(result, current) {
        return result + parseFloat(current);
    }, 0);
}
然后groupby覆盖
id
,提取所需的值并对其应用sum

_.chain(myArray )
    .groupBy("id")
    .map(function(value, key) {
        return {
            id: key,
            rendering : sum(_.pluck(value, "rendering")),
            completed: sum(_.pluck(value, "completed"))
        }
    })
    .value();

尽可能减少循环次数的解决方案

function myMerge(myArray) {
    var temp = {},
        myDesiredArray = [];
    for (var i = 0; i < myArray.length; ++i) {
        var elem = myArray[i];
        if (!temp[elem.id]) {
            temp[elem.id] = {
                'id': elem.id,
                'rendering': elem.rendering,
                'completed': elem.completed,
            };
            myDesiredArray.push(temp[elem.id])
        }
        temp[elem.id].rendering += elem.rendering;
        temp[elem.id].completed += elem.completed;

    }
    return myDesiredArray;
}
函数myMerge(myArray){
var temp={},
myDesiredArray=[];
对于(变量i=0;i
有多种方法,但当您想要检查唯一性时,最简单的方法是使用一个临时映射,由您的ID索引,您可以在该映射上累积其他属性的值

累积完成后,将贴图转换为直线阵列,等等

你可以这样做:

var array;    // defined elsewhere
var tmp = {}; // temporary map

// accumulate the properties in the map
array.forEach(function(elt) {
  if (tmp[elt.id] == null)
    tmp[elt.id] = elt
  else {
    tmp[elt.id].prop += elt.prop;
    // (...) do the accumulation here
  }
});

// then convert this map to an array by iterating on the ids
Object.keys(tmp).map(function(id) { return tmp[id]; })

如何在“myDesiredArray”中获得渲染和完成的值?@DTing,感谢您的关注。我纠正了我的帖子。