鉴于以下数据来源:
[
{
"Username" : "Patrick",
"Time" : "08:01:32",
"Status" : "log in"
},
{
"Username" : "Patrick",
"Time" : "08:34:31",
"Status" : "idle"
},
{
"Username" : "Patrick",
"Time" : "08:52:10",
"Status" : "meeting"
},
{
"Username" : "Patrick",
"Time" : "10:07:52",
"Status" : "daily tasks"
},
{
"Username" : "Patrick",
"Time" : "12:00:11",
"Status" : "lunch"
},
{
"Username" : "Mark",
"Time" : "07:40:32",
"Status" : "log in"
},
{
"Username" : "Mark",
"Time" : "08:54:31",
"Status" : "meeting"
},
{
"Username" : "Mark",
"Time" : "09:52:10",
"Status" : "idle"
},
{
"Username" : "Mark",
"Time" : "10:07:52",
"Status" : "daily tasks"
},
{
"Username" : "Mark",
"Time" : "12:30:11",
"Status" : "lunch"
}
]
如何以简单的方式获取此数组中每个名称的最后一次出现?我在考虑过滤功能但是我不知道如何继续这个。任何支持或提示将受到高度赞赏。
预期结果应如下:
[
{
"Username" : "Patrick",
"Time" : "12:00:11",
"Status" : "lunch"
},
{
"Username" : "Mark",
"Time" : "12:30:11",
"Status" : "lunch"
}
]
答案 0 :(得分:5)
使用ES6,您可以将数组缩减为地图,然后将值传播回数组:
const data = [{"Username":"Patrick","Time":"08:01:32","Status":"log in"},{"Username":"Patrick","Time":"08:34:31","Status":"idle"},{"Username":"Patrick","Time":"08:52:10","Status":"meeting"},{"Username":"Patrick","Time":"10:07:52","Status":"daily tasks"},{"Username":"Patrick","Time":"12:00:11","Status":"lunch"},{"Username":"Mark","Time":"07:40:32","Status":"log in"},{"Username":"Mark","Time":"08:54:31","Status":"meeting"},{"Username":"Mark","Time":"09:52:10","Status":"idle"},{"Username":"Mark","Time":"10:07:52","Status":"daily tasks"},{"Username":"Mark","Time":"12:30:11","Status":"lunch"}];
const result = [...data.reduce((m, o) => m.set(o.Username, o), new Map()).values()];
console.log(result);

在ES5中,您可以将数组缩减为包含唯一项的对象,然后使用Object#键将对象映射回数组:
var data = [{"Username":"Patrick","Time":"08:01:32","Status":"log in"},{"Username":"Patrick","Time":"08:34:31","Status":"idle"},{"Username":"Patrick","Time":"08:52:10","Status":"meeting"},{"Username":"Patrick","Time":"10:07:52","Status":"daily tasks"},{"Username":"Patrick","Time":"12:00:11","Status":"lunch"},{"Username":"Mark","Time":"07:40:32","Status":"log in"},{"Username":"Mark","Time":"08:54:31","Status":"meeting"},{"Username":"Mark","Time":"09:52:10","Status":"idle"},{"Username":"Mark","Time":"10:07:52","Status":"daily tasks"},{"Username":"Mark","Time":"12:30:11","Status":"lunch"}];
var uniques = data.reduce(function(m, o) {
m[o.Username] = o;
return m;
}, Object.create(null));
var result = Object.keys(uniques).map(function(key) {
return uniques[key];
});
console.log(result);

答案 1 :(得分:2)
如果时间大于插入对象的最后一次,您可以使用哈希表并使用显式检查。
此提案也适用于未分类的数据。
var data = [{ Username: "Patrick", Time: "08:01:32", Status: "log in" }, { Username: "Patrick", Time: "08:34:31", Status: "idle" }, { Username: "Patrick", Time: "08:52:10", Status: "meeting" }, { Username: "Patrick", Time: "10:07:52", Status: "daily tasks" }, { Username: "Patrick", Time: "12:00:11", Status: "lunch" }, { Username: "Mark", Time: "07:40:32", Status: "log in" }, { Username: "Mark", Time: "08:54:31", Status: "meeting" }, { Username: "Mark", Time: "09:52:10", Status: "idle" }, { Username: "Mark", Time: "10:07:52", Status: "daily tasks" }, { Username: "Mark", Time: "12:30:11", Status: "lunch" }],
hash = Object.create(null),
result = data.reduce(function (r, o) {
if (!(o.Username in hash)) {
hash[o.Username] = r.push(o) - 1;
return r;
}
if (r[hash[o.Username]].Time < o.Time) {
r[hash[o.Username]] = o;
}
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:1)
您可以在回调中使用.filter()
和.some()
检查.filter()
中当前索引之间的索引的任何元素是否具有当前属性值
const arr = [{"Username":"Patrick","Time":"08:01:32","Status":"log in"}
,{"Username":"Patrick","Time":"08:34:31","Status":"idle"}
,{"Username":"Patrick","Time":"08:52:10","Status":"meeting"}
,{"Username":"Patrick","Time":"10:07:52","Status":"daily tasks"}
,{"Username":"Patrick","Time":"12:00:11","Status":"lunch"}
,{"Username":"Mark","Time":"07:40:32","Status":"log in"}
,{"Username":"Mark","Time":"08:54:31","Status":"meeting"}
,{"Username":"Mark","Time":"09:52:10","Status":"idle"}
,{"Username":"Mark","Time":"10:07:52","Status":"daily tasks"}
,{"Username":"Mark","Time":"12:30:11","Status":"lunch"}];
let res = arr.filter(({Username:a}, i) =>
!arr.some(({Username:b}, k) => k > i && a == b));
console.log(res);
答案 3 :(得分:1)
如果某人有兴趣获得每个用户名的第一次出现,有一种简单的方法可以将Nina的代码稍微调整一下,如下所示:
var data = [{ Username: "Patrick", Time: "08:01:32", Status: "log in" }, { Username: "Patrick", Time: "08:34:31", Status: "idle" }, { Username: "Patrick", Time: "08:52:10", Status: "meeting" }, { Username: "Patrick", Time: "10:07:52", Status: "daily tasks" }, { Username: "Patrick", Time: "12:00:11", Status: "lunch" }, { Username: "Mark", Time: "07:40:32", Status: "log in" }, { Username: "Mark", Time: "08:54:31", Status: "meeting" }, { Username: "Mark", Time: "09:52:10", Status: "idle" }, { Username: "Mark", Time: "10:07:52", Status: "daily tasks" }, { Username: "Mark", Time: "12:30:11", Status: "lunch" }],
hash = Object.create(null),
result = data.reduce(function (r, o) {
if (!(o.Username in hash)) {
hash[o.Username] = r.push(o) - 1;
return r;
}
if (r[hash[o.Username]].Time > o.Time) {
r[hash[o.Username]] = o;
}
return r;
}, []);
console.log(result);
只更改if语句(if (r[hash[o.Username]].Time > o.Time)
),这样可以获得所需的结果。我希望这可以帮助那些人。