Javascript 如何从数组中获取不同的对象
我有一个包含3个对象的数组,但我只想要与特定对象属性不同的值Javascript 如何从数组中获取不同的对象,javascript,arrays,json,ecmascript-6,Javascript,Arrays,Json,Ecmascript 6,我有一个包含3个对象的数组,但我只想要与特定对象属性不同的值artist\u name。我尝试使用map(),但未能实现我想要的。我有以下数组 "tracks": [ "artist_0": { "id": 1, "artist_name": "Taylor Swift"
artist\u name
。我尝试使用map()
,但未能实现我想要的。我有以下数组
"tracks": [
"artist_0": {
"id": 1,
"artist_name": "Taylor Swift"
},
"artist_1": {
"id": 1,
"artist_name": "Taylor Swift"
},
"artist_2": {
"id": 2,
"artist_name": "Ed Sheeran"
},
],
我想要这个
"tracks": [
"artist_0": {
"id": 1,
"artist_name": "Taylor Swift"
},
"artist_2": {
"id": 2,
"artist_name": "Ed Sheeran"
},
],
假设您有一个具有属性的对象,则可以使用属性筛选条目并创建一个新对象
const
曲目={artist_0:{id:1,atist_name:“Taylor Swift”},artist_1:{id:1,artist_name:“Taylor Swift”},artist_2:{id:2,artist_name:“Ed Sheeran”},
结果=对象。fromEntries(对象
.参赛作品(曲目)
.过滤器(
(s=>([,{id}])=>!s.has(id)和&s.add(id))
(新一套)
)
);
控制台日志(结果)代码>
。作为控制台包装{max height:100%!important;top:0;}
您可以通过减少条目来过滤曲目。在减少时,您可以生成一个密钥来“禁止”您已经遇到的任何密钥
const数据={
“轨道”:{
“艺术家0”:{“id”:1,“艺术家姓名”:“泰勒·斯威夫特”},
“艺术家1”:{“id”:1,“艺术家姓名”:“泰勒·斯威夫特”},
“艺术家2”:{“id”:2,“艺术家姓名”:“Ed Sheeran”}
}
}
常数filternique=(arr,keyFn)=>
对象条目(arr)
.reduce((附件,[键,项])=>(id=>
!acc.ban.has(身份证){
res:{…acc.res,[键]:item},
禁令:根据禁令添加(id)
}:acc)
(键Fn(项目)),
{res:{},ban:new Set})
.res;
常量唯一数据={
曲目:filternique(data.tracks,({id,artist\u name})=>`id}-${artist\u name}`)
};
console.log(uniqueData)代码>
。作为控制台包装{top:0;max height:100%!important;}
我们可以编写一个简单的函数来传递给过滤器,我们使用密钥生成函数对其进行配置。可能是这样的:
constbyunique=(fn,found=newset())=>(x)=>
((key=fn(x))=>found.has(key)?false:found.add(key))()
常量artistId=({artist:{id}})=>id
康斯特曲目=[{id:1,艺术家:{id:1,艺术家名称:“泰勒·斯威夫特”},专辑:{id:1,专辑名称:“无畏(泰勒版本)”},曲目名称:“爱情故事”,时间:“00:03:49”,流派:“流行音乐”},{id:2,艺术家:{id:1,艺术家名称:“泰勒·斯威夫特”},专辑:{id:1,专辑名称:“无畏(泰勒版本)”},曲目名称:“你属于我”,时间:“00:03:40”,类型:“流行”},{id:4,艺术家:{id:2,艺术家名称:“Ed Sheeran”},专辑:{id:2,专辑名称:“分割”},曲目名称:“完美”,时间:“00:04:23”,类型:“流行”}]
控制台日志(
曲目.过滤器(byUnique(artistId))
)
.as控制台包装{max height:100%!important;top:0}
下面是一个使用
//const objectScan=require('object-scan');
常量myData={
轨道:{
艺术家0:{id:1,艺术家名称:'Taylor Swift'},
艺术家1:{id:1,艺术家名称:'Taylor Swift'},
艺术家2:{id:2,艺术家名称:'Ed Sheeran'}
}
};
常量deleteUnunique=(数据)=>objectScan(['tracks.*.id']{
filterFn:({value,context,gparent,gproperty})=>{
if(context.has(value)){
删除gparent[gproperty];
}
增加(价值);
},
反面:假
})(数据,新集合());
log(deleteUnique(myData));
//=>集合{1,2}
console.log(myData);
/* => {
轨道:{
艺术家0:{id:1,艺术家名称:'Taylor Swift'},
艺术家2:{id:2,艺术家名称:'Ed Sheeran'}
}
}*/
。作为控制台包装{最大高度:100%!重要;顶部:0}
可能是因为我的代码占用了额外的空间,但我试图简化代码,以便您了解幕后情况
const obj = {
artist_0: {
id: 1,
artist_name: 'Taylor Swift',
},
artist_1: {
id: 1,
artist_name: 'Taylor Swift',
},
artist_2: {
id: 2,
artist_name: 'Ed Sheeran',
},
};
const unique = {};
const unique_id = [];
for (const val in obj) {
if (typeof unique[val] == 'undefined' && unique_id.includes(obj[val].id) == false) {
unique[val] = obj[val];
unique_id.push(unique[val].id);
}
}
console.log(unique);
首先,我们定义了一个具有重复值的对象。
然后我们定义了一个空的unique对象和一个空的unique_id数组,然后我们在主对象上迭代,检查该键是否存在于unique对象中,如果我们的unique数组不包含该id,并且我们的unique对象也不包含该键,那么还检查该对象的id是否在unique_id数组中将其签名到我们的唯一对象,并将id推送到唯一id数组,这样它就可以跟踪以前的所有id,然后我们将显示我们的唯一数组您真的有一个带有属性的数组吗?您可能在寻找reduce
而不是map
@NinaScholz是的。我从API获取它。您想要的键是什么对于对象,关键是artist
对象的id
?您是否以JSON的形式获取数据?非常感谢。非常有效。非常感谢。我真的得到了我想要的。