我有一个名为events.json的文件,我需要使用.map来创建我的对象,
var data = require('./events.json')
var newEventList = data.events.map(events => ({
id: events.id ,
name: events.name ,
venue: events.venue.name
}));
但是,有时我偶尔会得到两个相同的event.ids。在这些实例中,map方法在我的newEventList对象中创建一个重复的条目。如果id相同,我可以在map函数中设置条件以跳过该条目的“映射”吗?
要添加的一件事是,重复项在events.json中始终是连续的,因此If语句只会比较先前映射的项。
谢谢你的帮助。
使用lodash中提供的_.uniqBy
(假设OP想要一个loadash
解决方案)
var data = require('./events.json');
var _ = require('lodash')
var newEventList = _.uniqBy(data.events,'id').map(events => ({
id: events.id ,
name: events.name ,
venue: events.venue.name
}));
由于您使用的是lodash
,因此您可以使用_.uniqBy
函数来删除数组中的重复项:
const data = require('./events.json');
const uniqEvents = _.uniqBy(data.events, 'id');
const newEventList = uniqEvents.map(events =>
id: events.id ,
name: events.name ,
venue: events.venue.name
);
Array#map为原始数组中的每个项创建一个输出,因此您不能跳过项。您可以使用Array#reduce而不是帮手dedupe
Set。对于每个项目,检查id
是否在Set中。如果没有,请将其添加到结果数组和Set。
const data = require('./events.json')
const dedupe = new Set();
const newEventList = data.events.reduce((list, event) => {
if(!dedupe.has(event.id)) {
list.push({
id: event.id ,
name: event.name ,
venue: event.venue.name
});
dedupe.add(event.id);
}
return list;
}, []);
var idList = [];
var data = require('./events.json')
var newEventList = data.events.map(events => {
idList.indexOf(events.id) !== -1 return // If id exists, skip
idList.push(events.id); // Else push in list for comparing
return { // And add obj to array
id: events.id ,
name: events.name ,
venue: events.venue.name
}
});