2016-03-13 153 views
0

如何通过基于Javascript中的另一个数组的键来对对象进行排序?JavaScript通过基于另一个数组的键排序对象?

这是因为这里PHP Sort an Array by keys based on another Array?

同样的问题,但我需要为Javascript相同的过程。

感谢

+0

看由叶兰第二应答和执行JS中的[排序基于ID的另一个阵列对象的数组](HTTP –

+0

可能重复:// stackoverflow.com/questions/35538​​509/sort-an-array-of-objects-based-on-another-array-of-ids) –

回答

1

的JavaScript规范并不要求对象键保持它们的顺序,所以它是不是安全,试图对它们进行排序。实现该标准取决于每个环境,并且每个浏览器都以不同的方式执行此操作。我相信大多数现代浏览器会按照先入先出的原则对键进行排序,但由于它不是标准的一部分,因此在生产代码中信任它是不安全的。它也可能在较旧的浏览器中打破。你最好的选择是把你的对象键放到一个数组中,对该数组进行排序,然后通过排序后的键访问对象的值。

var myObject = { d: 3, b: 1, a: 0, c: 2 }, 
    sortedKeys = Object.getOwnPropertyNames(myObject).sort(); 

如果您需要,您可以将排序的值映射到新的数组中。

var orderedValues = sortedKeys.map(function (key) { return myObject[key]; }); 
2

正如QED2000所指出的那样,即使您创建了新的对象,也没有保证属性将保持特定的顺序。但是,您可以根据不同的阵列对键进行排序。

<script> 
    function sortArrayByArray(a, b) 
    { 
     return order.indexOf(a) - order.indexOf(b); 
    } 
    var order = new Array('name', 'dob', 'address'); 
    var customer = new Array(); 
    customer['address'] = '123 fake st'; 
    customer['name'] = 'Tim'; 
    customer['dob'] = '12/08/1986'; 
    customer['dontSortMe'] = 'this value doesnt need to be sorted'; 
    var orderedKeys = Object.keys(customer).sort(sortArrayByArray); 
    orderedKeys.forEach(function (key) { 
     document.write(key + "=" + customer[key] + "<br/>"); 
    }); 
</script> 

输出是

dontSortMe=this value doesnt need to be sorted 
name=Tim 
dob=12/08/1986 
address=123 fake st 
+0

谢谢!完美,如果我们想要“dontSortMe =这个值不需要排序”在“地址”之后,而不是开始? – Xanarus

+0

在这种情况下,脚本开始于:function sortArrayByArray(a,b) { return order.indexOf(b) - order.indexOf(a); }; var order = new Array('name','dob','address')。reverse(); – derloopkat

+0

很好,谢谢! – Xanarus

相关问题