2017-02-28 118 views
0

此问题涉及我的算法以及它为什么不起作用。更具体地说,我想知道如何改进以做我想做的事情。这就是为什么它与建议的重复问题不同。基于属性值对对象数组排序(int)

我想创建一个函数,它基于属性值(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 
     } 
    } 
}; 

既然这样,当我给它的对象数组这个代码不进行任何差别。这些元素仍然没有按照他们应该的顺序排列。我以正确的方式接近这个吗?我错过了明显的东西吗?

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

示例输入:organizTokens([{value:“if”,indexFound:7},{value:“a ”,indexFound:0}])

预期输出:[{值: “一个”,indexFound:0},{值: “如果”,indexFound:7}]

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

+1

你试过'Array.prototype.sort'吗?或者你想自己算法解决这个问题? –

+0

我没有。我现在检查文档。我正在寻找最高效,最理想的最简单的方法 - 因为它只是我正在构建的Lexer的巨型机器中的一个小型齿轮。 – Streamer

+0

你能发表一个数据输入的例子,预期的输出和你真的得到的输出吗? – zer00ne

回答

3

你可以使用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'); 
+0

在我的情况下,我怎么称呼它? a和b都等于相同的标记List吗?像这样?:list.sort(compareIndexFound(tokenList,tokenList))? – Streamer

+0

编辑:无所谓。我知道了。谢谢您的帮助。这比我想要做的要简单得多。 – Streamer

1

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

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

如果你使用像lodash实用或下划线,他们有一个排序功能 这是更简单:

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>

-1

使用带有自定义回调函数的JS排序方法。像这样:

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

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