仅使用javascript在数组中合并附近的重复值

时间:2016-12-21 21:45:30

标签: javascript arrays algorithm

我有一个从$('.player').each(function()生成的数组,如下所示:

["foo"]
["foo"]
["bar"]
["bar"]
["bar"]
["foo"]
["somethingelse"]

我希望此数组仅合并附近的值(前两个foo但不是最后一个,因为索引上方和下方没有foo

["foo"]
["bar"]
["foo"]
["somethingelse"]

有人能指出我如何在数组中合并重复值(如果接近相同的值)的正确方向吗?

到目前为止,我唯一拥有的就是这个,但遗憾的是,无论它们是什么索引,它都会合并值。

var uniqueNames = [];
$.each(fruits, function(i, el){
    if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});
console.log(uniqueNames);

编辑: 谢谢你的代码完美无瑕。仅仅据我所知,如果我想要将两个foos合并并重命名(如foo2)该怎么办?

2 个答案:

答案 0 :(得分:0)

我猜你可以用纯JS做如下



var arrs = [["foo"],["foo"],["bar"],["bar"],["bar"],["foo"],["somethingelse"]],
  result = arrs.reduce((p,c,i,a) => i ? c[0] !== a[i-1][0] ? (p.push(c),p) : p
                                      : (p.push(c),p),[]);
console.log(result);




答案 1 :(得分:0)

您可以使用O(N)中的直接纯JS进行此操作,如下所示:

var RemoveDuplicates = function(arr){
  if(arr.length<2)               //Array is too short to have duplicates
    return arr
  var ret = [arr[0]]             //First item cannot be a duplicate
  for(var i=1;i<arr.length;i++){ //Loop over all other items
    if(arr[i-1]!=arr[i])         //If previous item is the same, ignore this item
      ret.push(arr[i]);          //Previous item was different, so keep current
  }
  return ret;
}

arr = ["foo","foo","bar","bar","bar","foo","somethingelse"]
arr = RemoveDuplicates(arr)
console.log(arr)