我有两个对象数组,如下所示:
items = [{"id":"5","tobuy":"1","name":"pop"},
{"id":"6","tobuy":"1","name":"fish"},
{"id":"7","tobuy":"0","name":"soda"}]
pkgs = [{"item_id":"5","store":"Market","aisle":"3"},
{"item_id":"6","store":"Market","aisle":"2"},
{"item_id":"6","store":"Dept","aisle":"8"},
{"item_id":"7","store":"Market","aisle":"4"}]
我正在尝试对items数组进行排序,但是我想利用pkgs数组中的数据。
pkgs数组中的“ item_id”字段对应于items数组中的“ id”字段。
例如,我要排序:
- 首先按“降序”购买
- 然后按“商店”
- 然后按“过道”
- 然后按“名称”
虽然item_id和id在两个数组之间相对应,但没有一对一的关系。可能有0个或更多对应于任何给定项目的pkg。
(如果我有一个数据库,我将只连接表,但是在JavaScript中,我只有两个相关的数组)。
我不确定如何构建比较器函数并传递第二个数组。
谢谢你的帮助。
也许像这样?
items = items.map(function (item, index) {
return {
item: item,
pkg: pkgs[index] //I assumed associated pkgs were at the same index
};
}).sort(function (a, b) {
var pkgA = a.pkg, pkgB = b.pkg, r;
r = +b.item.tobuy - +a.item.tobuy;
if (r !== 0) return r;
r = pkgA.store < pkgB.store? -1 : (pkgA.store === pkgB.store? 0 : 1);
if (r !== 0) return r;
r = +pkgA.aisle - +pkgB.aisle;
if (r !== 0) return r;
return pkgA.name < pkgB.name? -1 : (pkgA.name === pkgB.name? 0 : 1);
}).map(function (item) {
return item.item;
});
除了合并数据,您还可以创建一个查找映射,该映射允许直接从sort函数快速检索关联的包。
例如
var pkgsMap = pkgs.reduce(function (res, pkg) {
res[pkg.item_id] = pkg;
return res;
}, {});
然后可以在sort函数中执行以下操作:
var pkgA = pkgsMap[a.id], pkgB = pkgsMap[b.id];
编辑:
实际上,pkgs数组中还有另一个字段称为“ ppu”,它是每单位价格。最低的ppu是将要使用的ppu。
您可以使用以下命令构建包映射,然后在sort函数中使用该映射来检索相关的包,如上所述,并实现sort算法。
var pkgsMap = pkgs.sort(function (a, b) {
//not sure what ppu is so I sort it as a string
return a.ppu < b.ppu? -1 : Number(a.ppu > b.ppu);
}).reduce(function (res, pkg) {
if (!(pkg.item_id in res)) res[pkg.item_id] = pkg;
return res;
}, {});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句