关于javascript:根据属性值(int)对对象数组进行排序

Sorting an array of objects based on a property value (int)

本问题已经有最佳答案,请猛点这里访问。

这个问题涉及我的算法以及为什么它不能工作。更具体地说,我想知道如何改进我想做的事情。这就是为什么它不同于建议的重复问题。

我正在尝试创建一个函数,该函数基于属性值(int)对对象数组进行排序,这些属性值(int)是所有对象共享的,"indexfound"。正如您可能怀疑的那样,我正试图放置在数组开头具有较低索引的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
function organizeTokens(list) {
    for (i = 0; i < list.length - 1; i++) {
        if (list[i].indexFound < list[i + 1].indexFound) {
          // do nothing
        } else if (list[i].indexFound > list[i + 1].indexFound) {
          var tempVal = list[i];
          list[i] = list[i + 1];
          list[i + 1] = tempVal;
        } else {
        // should not happen unless we are comparing the same token
        }
    }
};

事实上,当我向它提供一个对象数组时,这段代码没有任何区别。元素的顺序仍然不正确。我是以正确的方式接近这一点吗?我是否遗漏了一些明显的东西?

编辑:————————————————————————————————————————————————————————————————————————————————————————————————————————————————-

示例输入:OrganizeToKens([value:"if",indexfound:7,value:"a",indexfound:0])

预期输出:[值:"A",indexfound:0,值:"if",indexfound:7]

实际输出:值:"if",indexfound:7,值:"a",indexfound:0]


您可以使用Array.prototype.sort()并定义比较函数:

1
2
3
4
5
6
7
function compareIndexFound(a, b) {
  if (a.indexFound < b.indexFound) { return -1; }
  if (a.indexFound > b.indexFound) { return 1; }
  return 0;
}

list.sort(compareIndexFound);

上述比较函数的简单/简洁版本:

1
2
3
function compareIndexFound(a, b) {
  return a.indexFound - b.indexFound;
}

使用ES6:

1
list.sort((a, b) => a.indexFound - b.indexFound);

您可以定义自己的sortBy函数:

1
2
3
4
5
function sortBy(arr, prop) {
  return arr.sort((a, b) => a[prop] - b[prop]);
}

sortBy(list, 'indexFound');


您可以使用javascript的内置排序:

1
2
3
list.sort(function (l, r) {
    return l.indexFound - r.indexFound;
});

如果您使用像lodash或underline这样的实用程序,它们有一个排序函数更简单的是:

1
var sorted = _.sortBy(list, 'indexFound');

例子:

1
2
3
4
5
6
7
8
9
10
var list = [
    { indexFound: 9 },
    { indexFound: 3 },
    { indexFound: 17 },
    { indexFound: 1 }
];

var sorted = _.sortBy(list, 'indexFound');

console.log(sorted);
1
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js">


将JS排序方法与自定义回调函数一起使用。这样地:

1
2
3
list.sort(function (a, b) {
    return a.indexFound - b.indexFound;
});

这将按升序排序(从低到高)。