【问题标题】:What is the best way to realise "join" with JS objects?用 JS 对象实现“加入”的最佳方式是什么?
【发布时间】:2017-07-15 04:30:21
【问题描述】:

我正在使用 MeteorJS(和 MongoDB)。

我有两个收藏:

  • 事件,带有 idEvent
  • eventsType,带有 idEventType(有限列表 事件类型)

两个集合之间的链接必须用idEvent == idEventType实现。

目标是有一个事件数组,关联事件类型对象。

下面的代码是函数式的,但我觉得它很糟糕......你怎么想的?

  events() {
    // Type of event
    const eventsType = EventsType.find();
    const eventsTypeArray = [];
    eventsType.forEach((ev) => {
      eventsTypeArray[ev.idEventType] = ev;
    });

    // List of events
    const eventsList = Events.find();
    const eventsListArray = [];


    // Merge both data
    eventsList.forEach((ev) => {
      const evObj = ev;
      evObj.type = eventsTypeArray[ev.idEvent];
      eventsListArray.push(evObj);
    });

    return eventsListArray;
  }

谢谢! :D

【问题讨论】:

    标签: javascript arrays mongodb object meteor


    【解决方案1】:

    你可以map你的eventsList并使用Object.assign来丰富原始项目:

    eventsListArray = eventsList.map(ev => Object.assign({type: eventsTypeArray[ev.idEvent]}, ev))
    

    试运行:

    originalArray = [{a:"1"}, {a:"2"}];
    dataMap = { "1": 10, "2": 100 };
    mappedArray = originalArray.map(i=>Object.assign({b:dataMap[i.a]}, i));
    console.log(originalArray);
    console.log(mappedArray);
    

    结果:

    [{a:"1"}, {a:"2"}] //original array left untouched
    [{a:"1", b:10}, {a:"2", b:100}] // mappedArray contains the extra data
    

    【讨论】:

    • 完美!非常感谢。你知道我是否无法意识到 dataMap 的不足吗? :eventsType.forEach((ev) => { eventsTypeArray[ev.idEventType] = ev; }); 并直接实现一个find 比如?对于有类似的东西:`eventsList.map(ev => Object.assign(ev, { type: eventsList.find(ev.idTruc) })); eventsList 是 Collection.find () 的返回
    • @Aurélien 当然,Object.assign 的第一个参数可以是您想要用作结果基础的任何对象
    • 我觉得我们还没有互相理解,我很难用另一种语言表达我的担忧!代码胜于雄辩 ;-) jsfiddle.net/0aw8foLs
    • 仍然是一个很好的答案...!谢谢@亚伦。我有我今天所期望的一切。 :p
    • @Aurélien Pas de quoi !
    【解决方案2】:

    实际上我最近遇到了一个类似的问题,我想将两个集合中的数据连接起来。

    我的解决方案是创建一个新的local collection(这是一个仅存在于客户端上的集合)。

    客户:

    const LocalEvents = new Mongo.Collection(null);
    

    从那里,您可以加入它们并将新对象推送到 LocalEvents 集合中,而不是将已连接的对象推送到数组中。这使您能够从本地 minimongo 集合中查询新对象。您需要确保在模板/组件被销毁时清除本地集合。如果您的光标发生变化,还可以运行跟踪器函数来清空LocalCollection。

    Tracker.autorun((eventsType) => {
        LocalEvents.remove({});
    });
    

    【讨论】:

    • 谢谢!我暂时使用.map。 :)
    猜你喜欢
    • 2010-09-15
    • 2010-12-14
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多