排序数组删除条目?

时间:2012-02-17 17:53:17

标签: javascript sorting

在排序之前,我可以正确地按键访问数组值。

var a=[];
a['1']={'id':'1','aaa':'xxx'}
a['2']={'id':'2','bbb':'yyy'}

document.write(a['1'].id+' '+a['2'].id+'<br>')

排序后,键变成索引:

a.sort(function(a, b) {
   var x = a.id;
   var y = b.id;
   return ((x < y) ? -1 : ((x > y) ? 1 : 0));
});

alert('a["1"]='+a['1'].id+'\n\na["2"]='+a['2'])

a [“2”]变得不确定。问题出在哪儿?排序不正确吗?

以下是示例: http://jsfiddle.net/TJLtS/1/

2 个答案:

答案 0 :(得分:3)

您的问题是JavaScript中的数组是基于0的,而不是基于1的。排序后,您的第一个元素是a[0],第二个元素是a[1]。排序后没有a[2]

如果您要在浏览器中打开开发人员工具,您可以自己看到这一点 - 所有现代浏览器都拥有它们;谷歌如果你需要帮助找到它 - 并在排序后添加代码console.log(a)。使用alert是调试代码时最痛苦,效率最低的方法。

以下是您的脚本的更新版本:http://jsfiddle.net/TJLtS/2/

此外,为了将来参考,您可能希望更简单地声明您的对象文字:

var a = [
  {id:'1', aaa:'xxx'},     // This is a[0]
  {id:'2', bbb:'yyy'}      // This is a[1]
];

如您所见,作为合法标识符的密钥不需要在对象文字中引用。


修改以下是您可能感兴趣的两种选择,具体取决于您的需求:

将所有对象保留在已排序的数组中

var objects = [
  {id:"a1", name:"Jim"},
  {id:"a2", name:"Zed"}, 
  {id:"a3", name:"Bob"}, 
];
objects.sort(function(o1,o2){
  var n1 = o1.name, n2 = o2.name;
  return n1<n2 ? -1 : n1>n2 ? 1 : 0;
});
for (var i=0,len=objects.length; i<len; ++i ){
  console.log( objects[i].id );
}
// Result:
// a3, a1, a2

使用单独排序保留所有对象

var objects = {
  a1: {id:"a1", name:"Jim"},
  a2: {id:"a2", name:"Zed"}, 
  a3: {id:"a3", name:"Bob"}, 
};

// Easily look up an object by id (can't do this as easily or fast with array)
var id = "a2";
console.log( objects[id] ); // {id:"a2", name:"Zed"}

// Create an array just the ids
var ids = Object.keys(objects);

// Sort the array of ids based on properties of the objects the represent
ids.sort(function(id1,id2){
  var n1 = objects[id1].name, n2=objects[id2].name;
  return n1<n2 ? -1 : n1>n2 ? 1 : 0;
});

// Iterate the sorted array and use each key to find the object
for (var i=0,len=ids.length; i<len; ++i){
  console.log( objects[ids[i]].name );
}
// Result:
// Bob, Jim, Zed

答案 1 :(得分:1)

Java脚本数组从0开始。您的第0个元素现在已排序为最后一个。

请注意,样本中没有“多维数组” - 只是对象数组。