【问题标题】:Sort JavaScript Array in Artificial Order以人工顺序对 JavaScript 数组进行排序
【发布时间】:2019-03-25 02:41:12
【问题描述】:

我有一个由REST 查询返回的数组,它表示多步骤生产过程中的项目数。

var steps = [
  { name:'Package', value:3},
  { name:'Assemble', value:1 },
  { name:'Ship', value:7},
  { name:'Preprocess', value:9 },
  { name:'Paint', value:5 }
];

我想按照流程的顺序对它们进行排序,如下所示:

  1. 预处理
  2. 油漆
  3. 组装
  4. 船舶

我有其他的字母数字排序,我正在使用下划线,但我无法弄清楚这一点。

【问题讨论】:

  • 将排序顺序字段附加到对象并对其进行排序。或者单独保留一个排序顺序数组或其他东西。如果没有关于如何这些将被排序的信息,你就无法做到这一点。
  • 你想通过value订购这些吗?
  • @Matthi Preprocess 的值为 9 但它是第一个,所以没有。
  • @vlaz,我希望它们按照我在问题中显示的步骤 1-5 进行排序。
  • @vlaz 没错,这就是重点。除了来自另一个数组之外,不确定订单值的来源。不过还好解决了????

标签: javascript arrays sorting underscore.js


【解决方案1】:

您可以为想要的顺序获取一个对象,其中包含位置的数值。然后按此值排序。

var steps = [{ name: 'Package', value: 3 }, { name: 'Assemble', value: 1 }, { name: 'Ship', value: 7 }, { name: 'Preprocess', value: 9 }, { name: 'Paint', value: 5 }],
    order = { Preprocess: 1, Paint: 2, Assemble: 3, Package: 4, Ship: 5 };
    
steps.sort(({ name: a }, { name: b }) => order[a] - order[b]);

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

【讨论】:

    【解决方案2】:

    您可以创建一个对象,在订购时提及每个名称的优先级。

    let priority = {
      Preprocess: 1,
      Paint: 2,
      Assemble: 3,
      Package: 4,
      Ship: 5,
    }
    
    var steps = [
      { name:'Package', value:3},
      { name:'Assemble', value:1 },
      { name:'Ship', value:7},
      { name:'Preprocess', value:9 },
      { name:'Paint', value:5 }
    ];
    
    const result = steps.sort((a,b) => priority[a.name] - priority[b.name]);
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      我只是为每个步骤类型使用一个优先映射,以便我可以在比较函数中使用它。

      var steps = [
          { name: 'Package', value: 3 },
          { name: 'Assemble', value: 1 },
          { name: 'Ship', value: 7 },
          { name: 'Preprocess', value: 9 },
          { name: 'Paint', value: 5 }
      ];
      var stepPrecedenceMap = new Map([["Preprocess", 1], ["Paint", 2], ["Assemble", 3], ["Package", 4], ["Ship", 5]])
      
      console.log(
      steps.sort((stepA, stepB) => {  
      return stepPrecedenceMap.get(stepA.name) - stepPrecedenceMap.get(stepB.name)
      }));

      【讨论】:

        猜你喜欢
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 2021-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多