【发布时间】:2014-09-25 02:43:37
【问题描述】:
我有 2 个 JSON 对象数组,我希望将它们合并/组合在一起,然后总结任何匹配条目的数量。
这两个数组包含相同的结构,一个表示需要使用的设备列表...
var required = [
{ SerialisedEquipment: { SerialNo: "ser855212" }, Type: undefined, Serialised: true, Quantity: 1 },
{ SerialisedEquipment: { SerialNo: "ser288945" }, Type: undefined, Serialised: true, Quantity: 1 },
{ SerialisedEquipment: undefined, Type: { ItemId: "itm71770" }, Serialised: false, Quantity: 5 },
{ SerialisedEquipment: undefined, Type: { ItemId: "itm11025" }, Serialised: false, Quantity: 2 }];
...另一个代表实际使用过的设备列表。
var used = [
{ SerialisedEquipment: { SerialNo: "ser663033" }, Type: undefined, Serialised: true, Quantity: 1 },
{ SerialisedEquipment: { SerialNo: "ser288945" }, Type: undefined, Serialised: true, Quantity: 1 },
{ SerialisedEquipment: undefined, Type: { ItemId: "itm71770" }, Serialised: false, Quantity: 2 }];
我可以访问 underscore.js,并且一直在尝试使用 _.groupBy 和 _.reduce 方法来尝试获得我想要的结果,但没有成功。我希望达到的结果是:
var result = [
{ SerialisedEquipment: { SerialNo: "ser663033" }, Type: undefined, Used: 1, Expected: 0, Remaining: 0 },
{ SerialisedEquipment: { SerialNo: "ser288945" }, Type: undefined, Used: 1, Expected: 1, Remaining: 0 },
{ SerialisedEquipment: { SerialNo: "ser855212" }, Type: undefined, Used: 0, Expected: 1, Remaining: 1 },
{ SerialisedEquipment: undefined, Type: { ItemId: "itm71770" }, Used: 2, Expected: 5, Remaining: 3 },
{ SerialisedEquipment: undefined, Type: { ItemId: "itm11025" }, Used: 0, Expected: 2, Remaining: 2 }];
我也一直在研究 underscore 提供的一些 Array 方法,但我不确定如何使用这些方法来指定合并条件。有人对实现这一目标的最佳方法有什么建议吗?
更新
我已经设法获得了两个数组的合并列表,删除了重复项...
// Split based on the serialised flag - so I know to look at either the serialNo or Type property
var isSerialised = _.groupBy(required, function (equip) {
return equip.Serialised;
});
// Get all the required serialised equipment that is not already in the used list
var serialised = _.filter(isSerialised[true], function (value) {
return (!_.some(used, function (equip) {
return equip.SerialisedEquipment && equip.SerialisedEquipment.SerialNo == value.SerialisedEquipment.SerialNo;
}));
});
// Get all the required types that are not already in the used list
var types = _.filter(isSerialised[false], function (value) {
return (!_.some(used, function (equip) {
return equip.Type && equip.Type.ItemId == value.Type.ItemId;
}));
});
// Combine the equipment that is not in the list with the equipment that is in the list
var result = _.union(used, serialised, types);
我认为现在只是用所需设备列表循环遍历此结果列表并根据序列号或类型总结匹配的设备。
【问题讨论】:
-
嗨,qtheintro,你能发布你的代码来查看你的错误吗!
-
嗨 Papouche,我一直在尝试通过使用下划线库来获得结果,但我并没有真正得到错误,但我的代码目前离正确的结果还很远,我'我更加努力地思考问题并寻找可能指向正确方向的指针。
标签: javascript arrays underscore.js