我有一个对象数组,我需要根据一些配置数据将其按一定顺序放置。我有一个问题,通过迭代数组在适当的顺序。我认为,如果我创建了数组,然后使用for循环逐步执行,我就能够正确地执行代码。它工作得很好,除了在一个用例中,我将第四项添加到数组中,然后返回到第三项。
links[0] = foo
links[1] = bar
links[2] = foobar
links[3] = a_herring
links[4] = a_shrubery
order = [] //loaded from JSON, works has the numbers 1 2 3 or 4 as values
//in this case:
order[0] = 1
order[1] = 2
order[2] = 4
order[3] = false
order[4] = 3
for(x in order){
if(order[x]){
printOrder[order[x]]=links[x]
//remember that in this case order[0] would
}
这应该会给我一个像这样的数组:
//var printOrder[undefined,foo,bar,a_shrubbery,foobar]
但是当我尝试遍历数组时:
for(x in printOrder){
printOrder[x].link.appendChild(printOrder[x].image)
printOrder[x].appendChild(printOrder[x].link)
printOrder[x].appendChild(printOrder[x].text)
document.getElementById("myDiv").appendChild(printOrder[x]);
}
我得到foo, bar, foobar, a_shrubbery
作为输出。
我需要按键值对这个数组进行排序,或者按正确的顺序逐步进行。
数组实例的数字索引属性的迭代应该始终使用数字索引:
for (var x = 0; x < printOrder.length; ++x) {
// whatever with printOrder[x]
}
使用"for…in"形式的语句不会让你得到可预测的顺序,正如你所看到的,它也可能有其他奇怪的效果(特别是当你混合在JavaScript框架或工具库或其他)。它用于遍历对象的属性名,并且不会对Array实例进行特殊处理。
您需要创建一个函数来查找数组中的值,如下所示:
Array.prototype.indexOf = function(value)
{
var i = this.length;
while ( i-- )
{
if ( this[ i ] == value ) return i;
}
return -1;
};
你可以这样使用它:
//NOTICE: We're looping through LINKS not ORDER
for ( var i = 0; i < links.length; i++ )
{
var index = order.indexOf( i );
//It's in the order array
if ( index != -1 ) printOrder[ i ] = links[ i ];
}
记住:你需要确保json返回的值是整数。如果它们是字符串,那么在传递给indexOf时需要将整数转换为字符串。
你的问题的功能,你建议它应该工作。
http://jsfiddle.net/NRP2D/8/。
很明显,在这个简化的例子中,你已经删除了你在实际情况中所犯的任何错误。