Javascript 筛选唯一字段值的数组

Javascript 筛选唯一字段值的数组,javascript,arrays,filter,Javascript,Arrays,Filter,我知道有很多方法可以过滤数组中的唯一值,但是如何过滤数组中给定字段中具有唯一值的对象呢 例如,我有[obj1,obj2,obj3,…],其中每个对象的形式如下: { firstName: "...", lastName: "..." } 如何过滤数组,以最终得到所有对象都有唯一名字的数组?单行程序会更好,但不会以可读性为代价。您可以使用方法,并将初始值设置为数组,有条件地将对象推送到新数组,即,如果名字不存在: var arr=[{firstname:“约翰”, 姓氏:“Doe”}, {名字

我知道有很多方法可以过滤数组中的唯一值,但是如何过滤数组中给定字段中具有唯一值的对象呢

例如,我有
[obj1,obj2,obj3,…]
,其中每个对象的形式如下:

{
firstName: "...",
lastName: "..."
}
如何过滤数组,以最终得到所有对象都有唯一名字的数组?单行程序会更好,但不会以可读性为代价。

您可以使用方法,并将初始值设置为数组,有条件地将对象推送到新数组,即,如果名字不存在:

var arr=[{firstname:“约翰”,
姓氏:“Doe”},
{名字:“简”,
姓氏:“Doe”},
{名字:“约翰”,
姓氏:“Doe”}];
console.log(
arr.reduce(
功能(唯一性,对象){
如果(!unique_arr.some(x=>x.firstname===obj.firstname)){
唯一arr.推送(obj)
}
返回唯一的_arr;
}, [])
);两行怎么样

var-ar=[{firstName:'Jo'},{firstName:'Bill'},{firstName:'Bill'}];
var firstNames=[];
var uniqueFirstName=ar.filter(obj=>
firstNames.indexOf(obj.firstName)>-1
?false:名字。推送(对象名字))

log(JSON.stringify(uniqueFirstName))您可以将数组缩减为一个数组,然后将贴图值分散回一个数组

如果要保留遇到的第一个对象,必须检查贴图是否已将
firstName
作为键,并且仅当它不存在时才进行设置

const arr=[{“firstname”:“Robert”,“lastname”:“Smith”},{“firstname”:“Francis”,“lastname”:“Collins”},{“firstname”:“Robert”,“lastname”:“Ludlum”},{“firstname”:“Francis”,“lastname”:“bacon”};
const result=[…arr.reduce((map,obj)=>map.has(obj.firstname)?map:map.set(obj.firstname,obj),new map()).values();

控制台日志(结果)仅过滤阵列中先前未找到的项目。我们将
cond
定义为返回两项是否应被视为“相等”

函数唯一性(a,cond){
返回a.filter((e,i)=>a.findIndex(e2=>cond(e,e2))==i);
}
常数测试=[
{姓:“约翰”,姓:“多伊”},
{姓:“简”,姓:“多伊”},
{姓:“约翰”,姓:“史密斯”}
];

log(uniqueBy(test,(o1,o2)=>o1.firstname==o2.firstname))答案似乎意在检查结果数组是否具有值,但为了唯一性,我发现使用对象更容易、更易于管理,并且总是设置值,而无需检查它。这取决于对象可能只有唯一键的前提:

var-arr=[{
名字:“艾米”,
姓:“亚当斯”
},
{
名字:“布莱恩”,
姓:“心”
},
{
名字:“艾米”,
姓:“亚当斯”
}
];
var unique={};
对于(变量i=0,n=arr.length;iconsole.log('Values:',Object.Values(unique))我会过滤并保留一组已经出现的thr名字:

 const names = new Set();

 const result = array.filter(({ firstName }) => !names.has(firstName) && names.add(firstName));

只是好奇为什么在内部使用arrow函数,而在reduce中使用传统的函数literal。这个偏好是无意的还是无意的,或者你有什么像样的风格规则可以遵循?@vol7ron这是无意的,我想也是因为reduce函数比内部简单的arrow函数要复杂一点。你能把它包装在一个片段中,这样我们就可以看到它在起作用了吗?这会返回一个唯一名字的列表,还是OP想要的一个具有唯一名字的对象的列表?@torazaburo它应该从torazaburo的答案返回对象列表,1行是:
arr.filter((e,i)=>arr.findIndex(e2=>e.firstName==e2.firstName)==i)