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]
您可以使用
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); |
。
您可以定义自己的
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; }); |
。
这将按升序排序(从低到高)。