【问题标题】:JavaScript Check if a array of property is ascending sortedJavaScript 检查属性数组是否按升序排序
【发布时间】:2019-04-17 12:43:07
【问题描述】:

您好,我需要一种更好的方法来检查属性数组是否按升序排序。 我用下面 数组可以具有动态长度属性。

必须使用 DrawCD 属性对数组进行排序 我想在不使用 for 循环的情况下以更好的方式做到这一点,如果可以使用 Array 原型函数

pevDrawInfo = [{
    "drawCD": 16281,
    "drawTime": "14:55:00",
    "winCol": 2,
    "oddEven": 0
  },
  {
    "drawCD": 16280,
    "drawTime": "14:50:00",
    "winCol": 2,
    "oddEven": 0
  },
  {
    "drawCD": 16279,
    "drawTime": "14:45:00",
    "winCol": 2,
    "oddEven": 0
  },
  {
    "drawCD": 16278,
    "drawTime": "14:40:00",
    "winCol": 2,
    "oddEven": 0
  }
];



for (i = 0; i < 2; i++) {
  if (pevDrawInfo[i].drawCD - pevDrawInfo[i + 1].drawCD > 0)
    sorted = false
  else
    sorted = true
}


console.log(sorted)

【问题讨论】:

  • “更好”怎么样?更少的代码行?更少的 CPU 周期?内存少?我们需要一个客观的衡量标准来评判答案,否则问题将被关闭为“主要基于意见”。
  • 如果你需要它排序为什么不排序它以防万一
  • 我已经更新了我的请求。我不会对其进行排序,这必须从 API 请求中返回排序,我需要检查是否已排序

标签: javascript


【解决方案1】:

您可以向Array#every查询,并带上该物业进行查询。

var pevDrawInfo = [{ drawCD: 16281, drawTime: "14:55:00", winCol: 2, oddEven: 0 }, { drawCD: 16280, drawTime: "14:50:00", winCol: 2, oddEven: 0 }, { drawCD: 16279, drawTime: "14:45:00", winCol: 2, oddEven: 0 }, { drawCD: 16278, drawTime: "14:40:00", winCol: 2, oddEven: 0 }];

console.log(pevDrawInfo.every((b, i, { [i - 1]: a }) => !a || a.drawCD < b.drawCD));

pevDrawInfo.sort(({ drawCD: a }, { drawCD: b }) => a - b);

console.log(pevDrawInfo.every((b, i, { [i - 1]: a }) => !a || a.drawCD < b.drawCD));

【讨论】:

    【解决方案2】:

    你可以使用reduce函数:

    !!pevDrawInfo.reduce((n, item) =&gt; item.drawCD &gt;= n.drawCD &amp;&amp; item)

    pevDrawInfo = [{
        "drawCD": 16281,
        "drawTime": "14:55:00",
        "winCol": 2,
        "oddEven": 0
      },
      {
        "drawCD": 16288,
        "drawTime": "14:50:00",
        "winCol": 2,
        "oddEven": 0
      },
      {
        "drawCD": 16288,
        "drawTime": "14:45:00",
        "winCol": 2,
        "oddEven": 0
      },
      {
        "drawCD": 16298,
        "drawTime": "14:40:00",
        "winCol": 2,
        "oddEven": 0
      }
    ];
    
    console.log(!!pevDrawInfo.reduce((n, item) => item.drawCD >= n.drawCD && item))

    【讨论】:

      【解决方案3】:

      您可以先将map() 对象数组转换为所需值的数组。然后与排序后的数组进行比较。

      var pevDrawInfo = [{ drawCD: 16281, drawTime: "14:55:00", winCol: 2, oddEven: 0 }, { drawCD: 16280, drawTime: "14:50:00", winCol: 2, oddEven: 0 }, { drawCD: 16279, drawTime: "14:45:00", winCol: 2, oddEven: 0 }, { drawCD: 16278, drawTime: "14:40:00", winCol: 2, oddEven: 0 }];
      
      function isSorted(arr,key){
        arr = arr.map(x => x[key])
        return JSON.stringify(arr) === JSON.stringify(arr.sort((a,b) => b-a))
      }
      
      console.log(isSorted(pevDrawInfo,"drawCD"))

      【讨论】:

        【解决方案4】:

        “更好”通常意味着“可重复使用”、“更快”或“更具可读性”:

        “可重复使用”:

        • 将其抽象为一个函数,该函数接受一个数组和一个键,并检查每个对象的键属性是否都在升序。

        • 让它使用动态长度,i &lt; 2 将不起作用。

        “更快”

        • 不确定你的代码是否可以改进,它已经是 O(n) 并且不使用不必要的变量/循环。

        • 但是,您可以提前退出:如果您发现一个条目正在下降,则无需检查其余条目。

        “更易读”

        看起来已经不错了(老实说比答案更好)。

         function isAscending(array, key) {
           for (let i = 1; i < array.length; i++) {
             if (array[i - 1][key] - array[i][key] > 0)
              return false;
           }
           return true;
         }
        

        “不使用 for 循环的更好方法”

        为什么?它是否使您的代码更具可读性?在这种情况下:绝对不是(向同事展示 Nina 的回答并询问他的作用)。因为比较慢?不。实际上,这比滥用 Array 助手之一来做他们不打算做的事情要快。

        【讨论】:

          【解决方案5】:

          我的方式...(更具可读性

          var
            pevDrawInfo = [
              { "drawCD": 16281, "drawTime": "14:55:00", "winCol": 2, "oddEven": 0 }
            , { "drawCD": 16280, "drawTime": "14:50:00", "winCol": 2, "oddEven": 0 }
            , { "drawCD": 16279, "drawTime": "14:45:00", "winCol": 2, "oddEven": 0 }
            , { "drawCD": 16278, "drawTime": "14:40:00", "winCol": 2, "oddEven": 0 }
            ];
          
          var sorted = true;
          
          pevDrawInfo.reduce((a,c)=>{
            sorted = sorted && (a.drawCD > c.drawCD); //  strict descending order (change to >=, < or <=..)
            return c;
          }) 
          
          console.log( 'strict descending order :', sorted )

          【讨论】:

            猜你喜欢
            • 2021-03-27
            • 1970-01-01
            • 2013-10-11
            • 1970-01-01
            • 2021-12-30
            • 2022-01-10
            • 2018-04-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多