在 JavaScript 中对对象数组进行排序

Sort array of objects in JavaScript

本文关键字:排序 数组 对象 JavaScript      更新时间:2023-09-26

我通过 json_encode 从 PHP 获得了一个 objetcs 数组。问题是在PHP端项目是有序的,但是当它到达JS端时,项目不是有序的。

myArray[96] = array ( "product" => "Drone",
"quant" => "23",
"available" => "true");
myArray[43] = array ( "product" => "Aereo",
"quant" => "2",
"available" => "false");
myArray[55] = array ( "product" => "Geos",
"quant" => "45",
"available" => "true");
myArray[13] = array ( "product" => "Barsad",
"quant" => "3",
"available" => "true");

那么,如何在 JavaScript 端按"产品"对该数组进行排序呢?

问题是PHP所谓的"数组"可以是,但也不能是JavaScript中的数组。您正在获取一个对象(或关联数组,或字典或哈希表):

{"96":{"product":"Drone","quant":"23","available":"true"},
 "43":{"product":"Aereo","quant":"2","available":"false"},
 "55":{"product":"Geos","quant":"45","available":"true"}...}

这在 JavaScript 中是不可排序的。你有三个选择:转换为真正的数组(如果你不关心键,或者如果你可以将键插入到对象中),使用索引数组(并对其进行排序),或者(在 ES6 中)使用 Map 及其约定,它应按插入顺序保留项目的顺序(但它仅适用于新的 JavaScript 环境)。

例如,一种方法是这样的(使用索引数组):

var data = {"96":{"product":"Drone","quant":"23","available":"true"},
     "43":{"product":"Aereo","quant":"2","available":"false"},
     "55":{"product":"Geos","quant":"45","available":"true"}};
var keys = Object.keys(data);
keys.sort(function(a, b) {
  var pa = data[a].product;
  var pb = data[b].product;
  if (pa === pb) return 0;
  return (pa < pb) ? -1 : 1;
});
keys.forEach(function(key) {
  console.log(key, data[key]);
});
<!-- results pane console output; see http://meta.stackexchange.com/a/242491 -->
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>