如何使Javascript数组按属性唯一

时间:2014-12-01 18:28:34

标签: javascript arrays

通过属性使Javascript数组唯一的快速方法是什么?

我有一个按时间戳排序的数组,如下所示:

[
    {
        ts: 1417048100,
        release: 1.0
    },
    {
        ts: 1417046900,
        release: 1.1
    },
    {
        ts: 1417046712,
        release: 1.0
    }
]

我希望通过版本号使其唯一,只保留具有最新时间戳的那些。在我的示例中,这意味着删除最后一个条目,因为该版本有更新的条目。

6 个答案:

答案 0 :(得分:2)

您可以使用forEach遍历数组,并将版本号存储在对象中,以确保已经迭代的任何版本都被拼接出阵列。

var arr = [{
    ts: 1417048100,
    release: 1.0
},
{
    ts: 1417046900,
    release: 1.1
},
{
    ts: 1417046712,
    release: 1.0
}];

var o = {};

arr.forEach(function(x, i) {
    if (x.release in o) arr.splice(i, 1);
    o[x.release] = null; 
});

document.body.innerHTML = '<pre>' + JSON.stringify(arr, null, 4) + '</pre>';

答案 1 :(得分:1)

使用release作为关键字将其转换为映射。

var output = {};
for(var i=0; i<input.length; i++) {
  output[input[i].release] = input[i].ts;
}

它会使用较新的释放密钥自动覆盖旧版本的密钥。

如果您需要它保持排序,那么您需要将其重新转换为列表并对其进行排序,或者仅通过剩余的输出键过滤原始列表。

答案 2 :(得分:0)

您可以使用 Array.prototype.reduce 以及 Array.prototype.some ,例如:

&#13;
&#13;
var items = [{ts: 1417048100,release: 1.0},{ts: 1417046900,release: 1.1},{ts: 1417046712,release: 1.0}];

var results = items.reduce(function(res, item){
var exists = res.some(function(t){ return (t.release === item.release );});        
     if (!exists){
        res.push(item);
     }
return res; },[]);
                                                                              document.body.innerHTML = '<pre>' + JSON.stringify(results) + '</pre>';
&#13;
&#13;
&#13;

Array.prototype.some 允许您检查数组中是否存在该项目,如果存在,则不包含在 Array.prototype.reduce 中处理数组时res.push(item);

如果您愿意使用其他库,您可能有兴趣检查lo-dash unique:

https://lodash.com/docs#uniq

答案 3 :(得分:0)

如果您可以使用jquery,那么尝试使用grep

var releases =[
    {
    ts: 1417048100,
    release: 1.0
    },
    {
        ts: 1417046900,
        release: 1.1
    },
    {
        ts: 1417046712,
        release: 1.0
    }];

    var newRelease={
        ts: 1517046712,
        release: 1.0
    };

releases = jQuery.grep(y, function(value) {
  return value.release != newRelease.release;
});

releases.push(newRelease);

答案 4 :(得分:0)

尝试

var arr = [
  {
    ts: 1417048100,
    release: 1.0
  },
  {
    ts: 1417046900,
    release: 1.1
  },
  {
    ts: 1417046712,
    release: 1.0
  }
]

, arr = arr.sort(function(a, b) {
  return (a.ts > b.ts) ? -1 : 1
}).filter(function(val, key) {
  return $.inArray(val.release, arr.map(function(v) {return v.release})) === key
});

    var arr = [
      {
        ts: 1417048100,
        release: 1.0
      },
      {
        ts: 1417046900,
        release: 1.1
      },
      {
        ts: 1417046712,
        release: 1.0
      }
    ]

    , arr = arr.sort(function(a, b) {
      return (a.ts > b.ts) ? -1 : 1
    }).filter(function(val, key) {
      return $.inArray(val.release, arr.map(function(v) {return v.release})) === key
    });

    $.each(arr, function(k, v) {
      $("<span>").html("release:" + v.release + ", timestamp:" + v.ts + "<br />")
      .appendTo("body")
    })
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

答案 5 :(得分:-1)

将数组转换为关联数组。关联数组中的键是唯一的。 节点中显示的示例代码。

→ node
> a ={ "1.0": 1417048100, "1.1": 1417046900}
{ '1.0': 1417048100,
  '1.1': 1417046900 }
> a["1.0"]
1417048100
> a["1.0"]=99999
99999
> a
{ '1.0': 99999,
  '1.1': 1417046900 }

为了更好地理解哈希和下面的博客文章,也可能会有所帮助。

http://www.javascriptkata.com/2007/03/29/how-to-use-javascript-hashes/