返回对象数组中最后一次出现的名称(多个名称)

时间:2017-09-26 08:39:44

标签: javascript arrays json

鉴于以下数据来源:

[
  {
  "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"
  }
]

4 个答案:

答案 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)),这样可以获得所需的结果。我希望这可以帮助那些人。