如何从数组中删除具有相同值的项目

时间:2015-10-20 15:50:10

标签: javascript arrays node.js

我在数组之间进行一些检查。它在NodeJS中。

问题是:

我有一个数组:

var items = [];

比插入一些值:

items[0] = {a:1, b:222};
items[1] = {a:1, b:333};
items[2] = {a:1, b:222};
items[3] = {a:1, b:4444};
items[4] = {a:1, b:222};

所以,我需要做的是:抛出所有数组并删除具有相同'b'值的项目。

示例:

过滤后,它应如下所示:

items[0] = {a:1, b:222};
items[1] = {a:1, b:333};
items[2] = {a:1, b:4444};

当你看到索引2和4的元素消失了,因为它们与索引0处的元素具有相同的b值。

如何在JavaScript中编写这个小代码?

3 个答案:

答案 0 :(得分:2)

您正在寻找Array.prototype.filter函数:

var bValues = {};
items = items
    .filter(function(item) {
        return bValues[item.b] === undefined && (bValues[item.b] = true);
    });

这可以通过检查我们是否看到特定的bValue并返回false来实现。如果我们没有,我们会在bValues地图上设置该值并返回true

编辑:我喜欢@dandavis的漂亮建议,使用this绑定参数来减少变量名称:

items = items
    .filter(function(item) {
        return this[item.b] === undefined && (this[item.b] = true);
    }, {});

答案 1 :(得分:0)

如果我正确理解您的问题,您希望执行传递以删除每个重复的public GetOrderResponse Get(GetOrder request) { return new GetOrderResponse() { ... } } 值。这实际上是一个算法问题而不是Javascript问题。有很多方法可以做到这一点,但我的答案将集中在表现上。

以下是在Javascript(b)中执行此操作的更快方法之一:

O(n)

此时,您可以专注于抽象出重复删除,以使其成为可重用的功能。

答案 2 :(得分:0)

所有答案都提出了大致相同的算法,因此归结为最易理解的内容。这是一个想法。我们首先用英语描述算法:

  
      
  1. 在所有项目中,请保留第一个b
  2.   
  3. 对于某个项目,"首先b"表示此项的索引等于其b属性等于项的b属性的第一个元素的索引。
  4.   

现在我们几乎可以将英语转换为JavaScript。

function removeDuplicatesOfB(items) {

  // Is this item the first in the array with its b property?
  function firstB(item, idx) { 
    return idx                 // The index of this item
      ===                      // equal to
      items.findIndex(         // the index of the first
       e =>                    // element 
         e.b                   // whose b property
         ===                   // is equal to
         item.b                // the b property of the item.
      )
    ;
  }


  return items .               // Of all the items,
    filter(                    // keep those with
      firstB                   // the first b.
    )
  ;
}

或者,以非评论形式:

function removeDuplicatesOfB(items) {

  function firstB(item, idx) {
    return idx === items.findIndex(e => e.b === item.b);
  }

  return items.filter(firstB);
}

下划线

下划线的_.uniq可以在睡眠中通过传递一个"谓词"告诉它如何比较对象以确定它们是否是相同的":

_.uniq(items, function(item) { return item.b; })