基于属性值(int)对对象数组进行排序

时间:2017-02-28 03:32:49

标签: javascript arrays sorting

这个问题涉及我的算法及其无效的原因。更具体地说,我想知道如何改进它来做我想做的事情。这就是为什么它与建议的重复问题不同。

我正在尝试创建一个函数,该函数根据它们共同共享的属性值(int)“indexFound”对对象数组进行排序。您可能怀疑,我正在尝试在数组的开头放置具有较低indexFound的元素。

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}])

预期输出:[{value:“a”,indexFound:0},{value:“if”,indexFound:7}]

实际输出:[{value:“if”,indexFound:7},{value:“a”,indexFound:0}]

3 个答案:

答案 0 :(得分:7)

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

function compareIndexFound(a, b) {
  if (a.indexFound < b.indexFound) { return -1; }
  if (a.indexFound > b.indexFound) { return 1; }
  return 0;
}

list.sort(compareIndexFound);

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

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

使用ES6:

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

您可以定义自己的sortBy功能:

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

sortBy(list, 'indexFound');

答案 1 :(得分:1)

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

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

如果您使用的是lodash或下划线等实用程序,则它们具有排序功能 这更简单:

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

示例:

&#13;
&#13;
var list = [
    { indexFound: 9 },
    { indexFound: 3 },
    { indexFound: 17 },
    { indexFound: 1 }
];

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

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

答案 2 :(得分:-1)

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

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

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