通过属性使Javascript数组唯一的快速方法是什么?
我有一个按时间戳排序的数组,如下所示:
[
{
ts: 1417048100,
release: 1.0
},
{
ts: 1417046900,
release: 1.1
},
{
ts: 1417046712,
release: 1.0
}
]
我希望通过版本号使其唯一,只保留具有最新时间戳的那些。在我的示例中,这意味着删除最后一个条目,因为该版本有更新的条目。
答案 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 ,例如:
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;
Array.prototype.some 允许您检查数组中是否存在该项目,如果存在,则不包含在 Array.prototype.reduce 中处理数组时res.push(item);
。
如果您愿意使用其他库,您可能有兴趣检查lo-dash unique:
答案 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/