无法按ID对JavaScript对象进行排序

时间:2014-07-28 17:54:04

标签: javascript arrays sorting

我的JavaScript对象需要以基于id的反向方式排序。

这是我的JavaScript对象:

var model.todos = 
{
  1:{"id":1,"text":"ksjdv;lv","completed":false},
  2:{"id":2,"text":"lsakckcv","completed":false},
  3:{"id":3,"text":"sakvalvs","completed":false}
}

当我尝试按照下面的指定排序时,我得到"未被捕获的类型错误未定义不是函数"错误

sortId.addEventListener('click',function(){
    todos.sort(sortItems);<================//get uncaught type error undefined is not a function error
    redrawUI(model);
}, false);

function sortItems(a, b) { 
    return( b.id - a.id);
}           

任何指针

3 个答案:

答案 0 :(得分:0)

嗯,首先,javascript对象是一个字典;我不确定尝试对字典进行排序是个好主意;它可能是可行的,然而,它可能不会给出最好的表现。您应该选择数组,而不是javascript对象。 类似的东西:

var todos = [{id:1}, {id:2]}, {id:3}];
todos.sort(function (a, b) { return b.id - a.id; });

答案 1 :(得分:0)

问题是todos是对象的对象,而函数sort是用于数组的,所有你需要做的就是将你的todos转换为数组并对数组进行排序

var todos_array = [];
for(key in model.todos) 
   todos_array.push(model.todos[key]);

然后你可以对你的数组进行排序:

todos_array = todos_array.sort(sortItem);

答案 2 :(得分:0)

阵列比其他人提到的更容易排序。我想补充一点,你的第一行是有问题的:你声明一个包含&#39;的变量。变量名中不允许使用点和点。

你可能打算做这样的事情:

var model = {}; // serves as a namespace for your models
model.todos = {
  1:{"id":1,"text":"ksjdv;lv","completed":false},
  2:{"id":2,"text":"lsakckcv","completed":false},
  3:{"id":3,"text":"sakvalvs","completed":false}
}