Javascript 如何从数组中获取不同的对象

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"

我有一个包含3个对象的数组,但我只想要与特定对象属性不同的值
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的形式获取数据?非常感谢。非常有效。非常感谢。我真的得到了我想要的。