Javascript 基于一个特性的唯一性筛选数组对象
我要处理的情况是,我有一个对象数组,我想过滤到一个数组,其中对象对于保留最后一个实例的一个属性是唯一的 例如,假设我有一个文件数组,如下所示:Javascript 基于一个特性的唯一性筛选数组对象,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,我要处理的情况是,我有一个对象数组,我想过滤到一个数组,其中对象对于保留最后一个实例的一个属性是唯一的 例如,假设我有一个文件数组,如下所示: let files = [ { filename: "filename.txt", uploadedBy: "Bob", comment: "Gee whiz" }, filename: "filename.txt",
let files =
[
{
filename: "filename.txt",
uploadedBy: "Bob",
comment: "Gee whiz"
},
filename: "filename.txt",
uploadedBy: "Jane",
comment: "Golly"
},
filename: "otherFile.txt",
uploadedBy: "Bob",
comment: "Shucks"
},
filename: "filename.txt",
uploadedBy: "Henry",
comment: "Gee Willikers"
},
]
我想要具有不同文件名的对象,我想要每个文件名的最后一个实例
[
filename: "otherFile.txt",
uploadedBy: "Bob",
comment: "Shucks"
},
filename: "filename.txt",
uploadedBy: "Henry",
comment: "Gee Willikers"
},
]
有没有一种简洁的方法可以做到这一点?我所能想到的就是一个相当长的方法,首先映射
数组以获得文件名,然后找到每个文件名的最后一个实例或其他东西
以下问题类似,但保留第一个值而不是最后一个值:
您可以首先从数组中只获取唯一的文件名,然后简单地映射它们并查找反转文件数组中的第一个元素
const f=[{“filename”:“filename.txt”,“uploadedBy”:“Bob”,“comment”:“Gee whiz”},{“filename”:“filename.txt”,“uploadedBy”:“Jane”,“comment”:“Golly”},{“filename”:“otherFile.txt”,“uploadedBy”:“Shucks”},{“filename”:“filename.txt”,“uploadedBy”:“Henry”,“comment”:“Gee Willikers”}.reverse();
const unique=[…新集合(f.map(({filename})=>filename))]
.map((名称)=>f.find(({filename})=>filename==name));
console.log(唯一)代码>缩小为一个映射,并使用文件名
作为键来设置项目,然后将映射.values()
迭代器展开回一个数组:
const files=[{“filename”:“filename.txt”,“uploadedBy”:“Bob”,“comment”:“Gee whiz”},{“filename”:“filename.txt”,“uploadedBy”:“Jane”,“comment”:“Golly”},{“filename”:“otherFile.txt”,“uploadedBy”:“Shucks”},{“filename”:“filename.txt”,“uploadedBy”:“Henry”,“comment”:“Gee Willikers”}]
常量结果=[。。。
files.reduce((m,o)=>m.set(o.filename,o),newmap())
.values()]
console.log(result)
您可以使用一个,其中每个唯一的文件名作为键,文件对象作为值。如果找到另一个具有相同文件名的条目
,它将覆盖以前的值。因此,这将永远是最后一次发生。然后获取映射到文件对象的结果
const files=[{filename:“filename.txt”,上传人:“Bob”,评论:“Gee whiz”},{filename:“filename.txt”,上传人:“Jane”,评论:“Golly”},{filename:“otherFile.txt”,上传人:“Bob”,评论:“Shucks”},{filename:“filename.txt”,上传人:“Henry”,评论:“Gee Willikers”},];
const map=new map(files.map(f=>[f.filename,f]),
unique=Array.from(map.values());
console.log(唯一)
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
// usage example:
var a = ['a', 1, 'a', 2, '1'];
var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']