使用javascript,根据值删除除最后一个对象以外的所有对象

使用javascript,根据值删除除最后一个对象以外的所有对象,javascript,arrays,Javascript,Arrays,我有一个目标 [ { "name":"keith", "skill":"kool", "job" :"rapper" },{ "name":"mike", "skill":"killer", "job" :"rapper" },{ "name":"Alan", "skill":"js", "job" :"slacker"

我有一个目标

[
    {
        "name":"keith",
        "skill":"kool",
        "job" :"rapper"
    },{
        "name":"mike",
        "skill":"killer",
        "job" :"rapper"
    },{
        "name":"Alan",
        "skill":"js",
        "job" :"slacker"
    },{
        "name":"Dre",
        "skill":"Dr",
        "job" :"rapper"
    },{
       "name":"Garth",
       "skill":"Guitar",
       "job":"singer"
    }

]
我只需要每项工作的最后一个目标。可以删除所有其他作业。我还需要保持顺序,因此预期对象将如下所示:

[{
        "name":"Alan",
        "skill":"js",
        "job" :"slacker"
    },{
        "name":"Dre",
        "skill":"Dr",
        "job" :"rapper"
    },{
       "name":"Garth",
       "skill":"Guitar",
       "job":"singer"
    }
]
“作业”值可以是任何字符串,未知


如何仅基于某个字段删除除最后一个重复对象之外的所有对象?

假设您的数组名为

var filteredPeople = [], foundJobs = [];
for (var i = people.length -1; i >= 0; i--) {
    if (foundJobs.indexOf(people[i].job) < 0) {
        foundJobs.push(people[i].job);
        filteredPeople.unshift(people[i]);
    }
}
var filteredPeople=[],foundJobs=[];
对于(var i=people.length-1;i>=0;i--){
if(foundJobs.indexOf(people[i].job)<0){
foundJobs.push(人[i].job);
过滤掉的人。取消(人[i]);
}
}

应该这样做。

您需要在数组中循环(我将其命名为jobs,请参见演示),并在其他数组中推送具有唯一job的对象。我创建了一个helper函数来检查新数组中是否存在具有特定作业的对象

var newarray=[]//用于存储具有唯一作业属性的对象的数组
//循环遍历作业数组

对于(var i=0;i,如果之前看到过作业,只需在所有条目上循环,然后从数组中过滤掉空值:

seen = {};
result = [];
for (int i=list.length-1; i>=0; --i) {
    var key = "!"+list[i].job; // avoid "constructor" problem
    if (!seen[key]) {
        seen[key] = 1;
        result.push(list[i]);
    }
});
result.reverse();

我在作业前面添加了
,然后再将其用作
seen
的键,因为
构造函数的名称总是出现在对象中(顺便说一句,“构造函数”听起来不像作业名称那么奇怪).

您没有对象,只有一个对象数组。您尝试了什么?为什么不简单地向后迭代?当然,如果您关心结果的顺序,您可能会使用
.unshift()
而不是
.push()
seen = {};
result = [];
for (int i=list.length-1; i>=0; --i) {
    var key = "!"+list[i].job; // avoid "constructor" problem
    if (!seen[key]) {
        seen[key] = 1;
        result.push(list[i]);
    }
});
result.reverse();