【问题标题】:sort and rearrange arrays basked on key value pair objects in javascript基于javascript中的键值对对象对数组进行排序和重新排列
【发布时间】:2022-02-15 21:42:55
【问题描述】:

我有 3 个或更多数组,它们根据重量 (w) 断点显示价格 (p),每个数组 (i) 都有唯一标识符,如下所示。

var arr1 = [{w:1,p:10,i:"car1"},{w:2,p:15,i:"car1"},{w:3,p:21,i:"car1"}]
var arr2 = [{w:1,p:12,i:"car2"},{w:2,p:13,i:"car2"},{w:3,p:22,i:"car2"}]
var arr3 = [{w:1,p:9,i:"car3"},{w:2,p:12,i:"car3"},{w:3,p:33,i:"car3"}]

我想生成基于最便宜、第二便宜、第三便宜等的“价格表”数组。这样的

var cheap1 = [{w:1,p:9,i:"car3"},{w:2,p:12,i:"car3"},{w:3,p:21,i:"car1"}]
var cheap2 = [{w:1,p:10,i:"car1"},{w:2,p:13,i:"car2"},{w:3,p:22,i:"car2"}]
var cheap3 = [{w:1,p:12,i:"car2"},{w:2,p:15,i:"car1"},{w:3,p:33,i:"car3"}]

产生这种输出的最快方法是什么。

我尝试将它们合并到一个数组中,然后将它们排序,然后循环遍历数组并根据具有 (w) 值的对象的索引是否等于前一个 (w) 值将对象推送到新数组中,但它就是行不通,我似乎找不到解决这个问题的方法。

我在多个 for 循环中尝试了多个 if then 语句,结果成功了,但问题是我可能有大约 20 个数组要比较,而 if 语句不可行。

感谢您的帮助!

【问题讨论】:

  • 欢迎来到 Stack Overflow!访问help center,使用tour 了解内容和How to Ask。如果您遇到困难,请发布您尝试的最小可重现示例,并使用[<>] sn-p 编辑器记录输入和预期输出。

标签: javascript node.js arrays sorting filtering


【解决方案1】:

您可以先按w 属性排序,然后再按p。为了获得排序数组的结果,将对象按索引的剩余部分推送到数组中。

const
    array1 = [{ w: 1, p: 10, i: "car1" }, { w: 2, p: 15, i: "car1" }, { w: 3, p: 21, i: "car1" }],
    array2 = [{ w: 1, p: 12, i: "car2" }, { w: 2, p: 13, i: "car2" }, { w: 3, p: 22, i: "car2" }],
    array3 = [{ w: 1, p: 9,i: "car3" }, { w: 2, p: 12,i: "car3"  }, { w: 3, p: 33, i: "car3" }],
    [cheap1, cheap2, cheap3] = [...array1, ...array2, ...array3]
        .sort((a, b) => a.w - b.w || a.p - b.p)
        .reduce((r, o, i) => {
            (r[i % 3] ??= []).push(o);
            return r;
        }, []);

console.log(cheap1);
console.log(cheap2);
console.log(cheap3);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 非常感谢,我完全忘记了减速器的存在。不是我想要的结构,但你指出了我正确的方向