按属性值对对象数组进行排序

IT技术 javascript arrays sorting
2020-12-23 16:09:29

我使用 AJAX 获得了以下对象并将它们存储在一个数组中:

var homes = [
    {
        "h_id": "3",
        "city": "Dallas",
        "state": "TX",
        "zip": "75201",
        "price": "162500"
    }, {
        "h_id": "4",
        "city": "Bevery Hills",
        "state": "CA",
        "zip": "90210",
        "price": "319250"
    }, {
        "h_id": "5",
        "city": "New York",
        "state": "NY",
        "zip": "00010",
        "price": "962500"
    }
];

如何创建一个函数来仅使用 JavaScriptprice属性按升序 降序对对象进行排序

6个回答

按价格升序排列房屋:

homes.sort(function(a, b) {
    return parseFloat(a.price) - parseFloat(b.price);
});

或者在 ES6 版本之后:

homes.sort((a, b) => parseFloat(a.price) - parseFloat(b.price));

可以在此处找到一些文档

对于降序,您可以使用

homes.sort((a, b) => parseFloat(b.price) - parseFloat(a.price));
您可以string1.localeCompare(string2)用于字符串比较
2021-02-11 16:09:29
@sg28 我认为您误解了 MDN 的解释。这并不是说排序功能不可靠,而是说它不稳定我理解为什么这会令人困惑,但这并不是说它不适合使用。在排序算法的上下文中,术语stable具有特定含义 -列表中的“相等”元素按与 input 中相同的顺序排序这与代码不稳定(即尚未准备好使用)的想法完全无关。
2021-02-19 16:09:29
感谢您的更新,@Pointy,我不记得遇到过这个问题,但也许行为在过去几年中发生了变化。无论如何,localeCompare()文档显示您可以明确说明是否需要区分大小写、数字排序和其他选项。
2021-02-26 16:09:29
请记住,localeCompare()是大小写不敏感的如果你想区分大小写,你可以使用(string1 > string2) - (string1 < string2). 布尔值被强制为整数 0 和 1 以计算差异。
2021-03-03 16:09:29
如果您想按特定的字符串值排序,例如按城市,您可以使用: this.homes.sort((current,next)=>{ return current.city.localeCompare(next.city)});
2021-03-04 16:09:29

这是一个更灵活的版本,它允许您创建可重用的排序函数,并按任何字段排序。

const sort_by = (field, reverse, primer) => {

  const key = primer ?
    function(x) {
      return primer(x[field])
    } :
    function(x) {
      return x[field]
    };

  reverse = !reverse ? 1 : -1;

  return function(a, b) {
    return a = key(a), b = key(b), reverse * ((a > b) - (b > a));
  }
}


//Now you can sort by any field at will...

const homes=[{h_id:"3",city:"Dallas",state:"TX",zip:"75201",price:"162500"},{h_id:"4",city:"Bevery Hills",state:"CA",zip:"90210",price:"319250"},{h_id:"5",city:"New York",state:"NY",zip:"00010",price:"962500"}];

// Sort by price high to low
console.log(homes.sort(sort_by('price', true, parseInt)));

// Sort by city, case-insensitive, A-Z
console.log(homes.sort(sort_by('city', false, (a) =>  a.toUpperCase()
)));

nickb - 你误读了代码。sort_by在 O(1) 中运行,并返回一个由内置排序 (O(N log N)) 使用的函数来比较列表中的项目。总复杂度为 O(n log n) * O(1),它减少到 O(n log n),或与快速排序相同。
2021-02-12 16:09:29
准备源数据不是更好吗,当显然源数据需要一些调整时,这会导致连续解析。
2021-02-12 16:09:29
我遇到的一个问题是,使用 reverse=false,它将数字排序为 1,2,3,4...但字符串为 z,y,x...
2021-02-15 16:09:29
一个小改进: var key = primer ? function (x) { return primer(x[field]); } : function (x) { return x[field]; }
2021-02-18 16:09:29
虽然[1,-1][+!!reverse]看起来很酷,但做起来很糟糕。如果用户无法正确调用您的方法,请惩罚他,无论如何都不要试图以某种方式理解它。
2021-02-21 16:09:29

要对其进行排序,您需要创建一个带有两个参数的比较器函数。然后使用该比较器函数调用排序函数,如下所示:

// a and b are object elements of your array
function mycomparator(a,b) {
  return parseInt(a.price, 10) - parseInt(b.price, 10);
}
homes.sort(mycomparator);

如果要升序排序,请切换减号两边的表达式。

这是一个实际解释该主题的参考资料,而不是说“它太复杂了,反正你也不会理解它”:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-02-11 16:09:29
parseInt(a.price, 10)等同parseInt(a.price)~~a.price
2021-03-07 16:09:29

用于字符串排序,以防有人需要它,

const dataArr = {

  "hello": [{
    "id": 114,
    "keyword": "zzzzzz",
    "region": "Sri Lanka",
    "supportGroup": "administrators",
    "category": "Category2"
  }, {
    "id": 115,
    "keyword": "aaaaa",
    "region": "Japan",
    "supportGroup": "developers",
    "category": "Category2"
  }]

};
const sortArray = dataArr['hello'];

console.log(sortArray.sort((a, b) => {
  if (a.region < b.region)
    return -1;
  if (a.region > b.region)
    return 1;
  return 0;
}));

return -1 是什么意思;并返回 1;?
2021-02-12 16:09:29

如果你有一个兼容ES6 的浏览器,你可以使用:

升序和降序排序顺序之间的区别在于比较函数返回的值的符号:

var ascending = homes.sort((a, b) => Number(a.price) - Number(b.price));
var descending = homes.sort((a, b) => Number(b.price) - Number(a.price));

这是一个工作代码片段:

var homes = [{
  "h_id": "3",
  "city": "Dallas",
  "state": "TX",
  "zip": "75201",
  "price": "162500"
}, {
  "h_id": "4",
  "city": "Bevery Hills",
  "state": "CA",
  "zip": "90210",
  "price": "319250"
}, {
  "h_id": "5",
  "city": "New York",
  "state": "NY",
  "zip": "00010",
  "price": "962500"
}];

homes.sort((a, b) => Number(a.price) - Number(b.price));
console.log("ascending", homes);

homes.sort((a, b) => Number(b.price) - Number(a.price));
console.log("descending", homes);