我需要通过JS为我的一个项目排序关联数组。我发现这个函数在firefox中运行得很好,但不幸的是它在IE8,OPERA,CHROME中无法工作......无法找到使其在其他浏览器中工作的方法,或者找到适合其目的的另一个函数。我真的很感激任何帮助。
function sortAssoc(aInput)
{
var aTemp = [];
for (var sKey in aInput) aTemp.push([sKey, aInput[sKey].length]);
aTemp.sort(function () {return arguments[0][1] < arguments[1][1]});
var aOutput = new Object();
//for (var nIndex = aTemp.length-1; nIndex >=0; nIndex--)
for (var nIndex = 0; nIndex <= aTemp.length-1; nIndex++)
aOutput[aTemp[nIndex][0]] = aInput[aTemp[nIndex][0]];
//aOutput[aTemp[nIndex][0]] = aTemp[nIndex][1];
return aOutput;
}
答案 0 :(得分:5)
这是不可能的。当使用Object
循环遍历其属性时,JavaScript中的for...in
(您正在使用的“关联数组”)是specified as having no defined order。您可以在某些浏览器的行为之间找到一些共同点,但it's not universal。
摘要:如果您需要特定顺序的对象,请使用数组。
答案 1 :(得分:1)
我知道这是一个旧职位,但那项工作:
问题是
aTemp.sort(function () {return arguments[0][1] < arguments[1][1]});
因为sort函数出现一个数字:
aTemp.sort(function (a, b) {
if (a[1] < b[1])
return 1;
else if (a[1] > b[1])
return -1;
else
return 0;
});
答案 2 :(得分:0)
我最近遇到了这个问题,发现了这个问题。我很失望地发现没有预先定义的方法来对关联数组进行排序,但它有意义并指出了我正确的方向。我没有完全意识到JS关联数组实际上是对象,只是名称中的数组。我有一个包含更多关联数组的关联数组,例如:
var firstChild = {'id': 0, 'name': 'company Two'};
var secondChild = {'id': 1, 'name': 'company One'};
var parent = {
'company Two': firstChild,
'company One': secondChild
};
以下函数将根据它的键对上面的父数组进行排序。为了使其按写入方式工作,父数组需要与关联数组中的值匹配的键。例如,父[&#39;唯一字符串&#39;]需要具有一些键值,该值包含&#39;唯一字符串&#39;。就我而言,这是名称密钥;但是,您可以选择任何您喜欢的键。
function associativeSort(givenArray, keyToSort) {
var results = [];
var temp = [];
for(var key in givenArray) {
temp.push(givenArray[key].name);
}
temp = temp.sort();
for(var x = 0; x < temp.length; x++) {
results[x] = givenArray[temp[x]];
}
return results;
}
鉴于我的示例数组,此函数将返回:
var parent = {
'company One': {'id': 1, 'name': 'company One'},
'company Two': {'id': 0, 'name': 'company Two'}
};
这是一个简单的解决方案,但我花了一些时间才想到。希望这有助于其他人面对这个问题。