【问题标题】:Lodash Map only on a ConditionLodash Map 仅在一个条件下
【发布时间】:2018-06-01 23:04:59
【问题描述】:

我有一个名为 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.id。在这些情况下,map 方法会在我的 newEventList 对象中创建一个重复条目。如果 id 相同,我可以在 map 函数中设置条件以跳过该条目的“映射”吗?

要添加的一点是,重复项在 events.json 中始终是连续的,因此 If 语句只会比较先前映射的项目。

感谢您的帮助。

【问题讨论】:

标签: javascript node.js object lodash


【解决方案1】:

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

【讨论】:

  • 这里有2个非常相似的答案,但我会选择这个,因为我喜欢它全部包含在一个函数中的方式。谢谢
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      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
      }
      });
      

      【讨论】:

      • 也感谢您的非 lodash 回答!
      猜你喜欢
      • 2018-04-24
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      相关资源
      最近更新 更多