Lodash地图仅适用于条件

问题描述 投票:0回答:4

我有一个名为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语句只会比较先前映射的项。

谢谢你的帮助。

javascript node.js object lodash
4个回答
2
投票

使用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  
 }));

1
投票

由于您使用的是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
);

1
投票

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;
}, []);

0
投票
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
}
});
© www.soinside.com 2019 - 2024. All rights reserved.