合并数组并组合值

时间:2015-05-21 16:37:03

标签: javascript arrays underscore.js lodash

我正在尝试组合一个对象数组,同时根据特定值删除重复项,在这种情况下它是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感到满意。任何建议将不胜感激。

6 个答案:

答案 0 :(得分:3)

使用下划线,这是一种方法

定义foreach($linkHtml->find('head meta[property=og:url]') as $url) { echo $url->content.'</br>'; } 函数

sum

然后在function sum(numbers) { return _.reduce(numbers, function(result, current) { return result + parseFloat(current); }, 0); } 上进行分组并获取所需的值并对它们应用总和。

id

答案 1 :(得分:2)

function merge(arr) {
  var uniqItems = arr.reduce(function(memo, item) {
    if (!memo[item.id]) {
      memo[item.id] = item;
    } else {
      Object.keys(item).forEach(function(k) {
        if (item[k]) { memo[item.id][k] = item[k]; }
      });
    }
    return memo;
  }, {});
  return Object.keys(uniqItems).map(function(k) {
    return uniqItems[k];
  });
}

merge(myArray); // => myDesiredArray

答案 2 :(得分:1)

有多种方法可以做,但是当你想要检查唯一性时,最简单的方法是使用一个临时地图,由你的id编制索引,你可以在其上积累其他属性的值。

累积完成后,将Map转换为直线阵列 et voila

你会这样做:

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]; })

答案 3 :(得分:0)

纯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]);
}

答案 4 :(得分:0)

这是另一个使用功能方法的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;
});

答案 5 :(得分:0)

可以减少循环的解决方案

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;
}