根据属性值(整数)对对象数组进行排序

5

这个问题涉及到我的算法以及为什么它不能正常工作。更具体地说,我想知道如何改进它,使其实现我想要的功能。这就是为什么它不同于建议的重复问题的原因。

我正在尝试创建一个函数,根据它们共同拥有的属性值(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}]


1
你尝试过 Array.prototype.sort 吗?还是你想自己算法地解决这个问题? - Yeldar Kurmangaliyev
我还没有。我现在会查看文档。我正在寻找最有效且理想情况下最简单的方法来完成这个任务 - 因为它只是我正在构建的Lexer巨大机器中的一个小齿轮。 - Streamer
你能否提供一个数据示例,包括输入、期望输出和实际输出? - zer00ne
https://dev59.com/UXNA5IYBdhLWcg3wAI3d - 对于整数也是一样的。 - Matthew W.
@Azurasky 为什么会尝试访问不存在的索引?冒泡排序涉及array.length次遍历。这就是它的工作原理。 - JLRishe
显示剩余3条评论
3个回答

23
您可以使用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');

在我的情境中,我该如何称呼这个?a和b都等于相同的token List吗?类似这样:list.sort(compareIndexFound(tokenList, tokenList))? - Streamer
不用了,我明白了。谢谢您的帮助。这比我之前尝试的要简单得多。 - Streamer

3
你可以使用JavaScript内置的sort方法:
list.sort(function (l, r) {
    return l.indexFound - r.indexFound;
});

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

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

例子:

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

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

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


0
使用JS sort方法与自定义回调函数。像这样:
list.sort(function (a, b) {
    return a.indexFound - b.indexFound;
});

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接