用JS对象实现"join"最好的方法是什么?
What is the best way to realise "join" with JS objects?
我正在使用 MeteorJS (aned MongoDB)。
我有两个合集:
- 事件,带有 idEvent
- eventsType,带有 idEventType(有限列表
事件类型)
两个集合之间的link必须用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
您可以map
your eventsList
and use 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
我最近遇到了类似的问题,我想连接两个集合中的数据。
我的解决方案是创建一个新的 local collection(这是一个仅存在于客户端的集合)。
客户:
const LocalEvents = new Mongo.Collection(null);
从那里,您可以加入它们并将新对象推入 LocalEvents
集合,而不是将连接的对象推入数组。这使您能够从本地 minimongo 集合中查询新对象。您需要确保在销毁 template/component 时清除本地集合。还有 运行 一个跟踪器功能,如果您的光标发生变化,它会清空 LocalCollection
。
Tracker.autorun((eventsType) => {
LocalEvents.remove({});
});
我正在使用 MeteorJS (aned MongoDB)。
我有两个合集:
- 事件,带有 idEvent
- eventsType,带有 idEventType(有限列表 事件类型)
两个集合之间的link必须用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
您可以map
your eventsList
and use 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
我最近遇到了类似的问题,我想连接两个集合中的数据。
我的解决方案是创建一个新的 local collection(这是一个仅存在于客户端的集合)。
客户:
const LocalEvents = new Mongo.Collection(null);
从那里,您可以加入它们并将新对象推入 LocalEvents
集合,而不是将连接的对象推入数组。这使您能够从本地 minimongo 集合中查询新对象。您需要确保在销毁 template/component 时清除本地集合。还有 运行 一个跟踪器功能,如果您的光标发生变化,它会清空 LocalCollection
。
Tracker.autorun((eventsType) => {
LocalEvents.remove({});
});