【问题标题】:Javascript reorder array of nested arrays in particular orderJavascript以特定顺序重新排序嵌套数组的数组
【发布时间】:2022-01-02 17:17:59
【问题描述】:

我正在寻找一种以特定顺序重新排列嵌套数组下方数组的方法。导入时,exposureLevel 数组中的值按任意顺序排列。

var exposureLevel = [["Exposure Level","Number"],["High",15],["Low",38],["Medium",105],["None",156]];

exposureLevel 数组中也可能缺少其中一些值。下面是一些可能的例子:

[["Exposure Level","Number"],["Low",38],["Medium",105]];
[["Exposure Level","Number"],["High",15],["None",156]];
[["Exposure Level","Number"],["High",15],["Medium",105],["None",156]];

我希望数组按下面的顺序排列,从标题 None, Low, Medium, High 之后的 [1] 元素开始。下面的三个数组显示了我希望上面的三个示例如何输出。我不完全确定如何执行此操作,但我必须进行某种类型的检查,以检查子数组中的字符串值在何处进行比较,并调整整个子数组在父数组中的位置。

[["Exposure Level","Number"],["Low",38],["Medium",105]];
[["Exposure Level","Number"],["None",156],["High",15]];
[["Exposure Level","Number"],["None",156],["Medium",105],["High",15]];

我在发布之前查看了这些帖子,但没有取得很大的成功:

  1. For-each over an array in JavaScript
  2. JOLT - Reorder nested arrays
  3. How do I check if an array includes a value in JavaScript?
  4. Javascript array contains/includes sub array

我目前的解决方案:

for (let i = 0; i < exposureLevel.length; i++) {

  if(exposureLevel[i][0] == "None"){
    console.log(exposureLevel[i][0])
  } 
  if(exposureLevel[i][0] == "Low"){
    console.log(exposureLevel[i][0])
  } 
  if(exposureLevel[i][0] == "Medium"){
    console.log(exposureLevel[i][0])
  } 
  if(exposureLevel[i][0] == "High"){
    //not sure how to push onto array correctly
    console.log(exposureLevel[i][0])
  }

}

我知道我当前的解决方案没有做任何事情,但我设法隔离了每个子数组中的字符串。下一步是将整个数组按指定顺序推入一个新数组中。如果有人知道执行上述操作的更好方法,请告诉我。

我对 JS 的经验很少。如果有人可以帮助我或为我指出正确的方向,我将不胜感激。如果需要任何进一步的信息,请告诉我。谢谢。

【问题讨论】:

    标签: javascript arrays for-loop


    【解决方案1】:

    Array.sort 将键映射到另一个设置orders

    const exposureLevel = [["Exposure Level","Number"],["High",15],["Low",38],["Medium",105],["None",156]];
    const orders = { None: 1, Low: 2, Medium: 3, High: 4 };
    const sorted = exposureLevel.sort((a, b) => (orders[a[0]] || 0) - (orders[b[0]] || 0));
    console.log(sorted);

    参考:Array.sort()

    【讨论】:

    • 感谢您帮助我。我不知道您可以这样设置订单。如果值发生变化会发生什么?有时它们会有所不同。
    • @geojoe 你指的是什么价值观?
    • 子数组中的数值
    • @geojoe 他们不影响排序顺序,任何数字都可以。
    【解决方案2】:

    使用一个对象来定义您的排序顺序,并在您的比较器中使用它:

    const o = {None: 0, Low: 1, Medium: 2, High: 3};
    
    const sort = ([h, ...v]) => [h, ...v.sort(([l1], [l2]) => o[l1] - o[l2])];
    
    console.log(sort([["Exposure Level","Number"],["Low",38],["Medium",105]]));
    console.log(sort([["Exposure Level","Number"],["High",15],["None",156]]));
    console.log(sort([["Exposure Level","Number"],["High",15],["Medium",105],["None",156]]));

    【讨论】:

    • 谢谢罗比,这个解决方案也很好用。
    【解决方案3】:

    使用Array.sort 对数组进行排序。

    逻辑

    • 利用引用数组order 来跟踪输出顺序。
    • 根据引用 order 数组中的标签索引对数组进行排序。

    const order = ["Exposure Level", "None", "Low", "Medium", "High"];
    var exposureLevel = [
      ["Exposure Level","Number"],
      ["High",15],
      ["Low",38],
      ["Medium",105],
      ["None",156],
    ];
    exposureLevel.sort((a, b) => {
      // Should return -1, 0 or +1
      if (order.indexOf(a[0]) > order.indexOf(b[0])) return 1;
      else if (order.indexOf(a[0]) < order.indexOf(b[0])) return -1;
      else return 0;
    });
    console.log(exposureLevel);

    单线解决方案

    const order = ["Exposure Level", "None", "Low", "Medium", "High"];
    const exposureLevel = [["Exposure Level","Number"], ["High",15], ["Low",38], ["Medium",105], ["None",156]];
    exposureLevel.sort((a, b) => order.indexOf(a[0]) - order.indexOf(b[0]));
    console.log(exposureLevel);

    【讨论】:

    • 谢谢 Nitheesh。这也很有效。但是,比其他解决方案稍长。
    • @geojoe 更长的代码行?我的解决方案也可以在线实现。我把详细的解决方案供大家理解。请用 4 行代码查看更新后的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多