尝试对JSON对象进行排序时遇到问题。基本上,人们可以按任意随机顺序将产品添加到我们的订单表单中,但是它在摘要中显示的顺序需要是我们希望它们如何定位(而不是他们选择它们的顺序),这就是我需要排序的原因'id'(或者我们稍后将按'pos'字段排序)
基本上,我需要按id升序排序。 1,2,103而不是2,103,1
我似乎遇到了问题,因为单个对象的索引是数字(或者只是它们存在的事实......)。
我需要按照array.sort(function(a,b){return a.id-b.id})的方式做一些事情;但我认为这不起作用,因为1,它不是一个数组(它是一个对象),2,它有那些讨厌的索引(我需要代码的另一部分)......
任何想法????
var products = {
"2": {
"id": "2",
"price": "119",
"quantity": "1",
"thumb": "img\/store\/comp-08n.png"
},
"103": {
"id": "103",
"price": "109",
"quantity": "1",
"thumb": "img\/store\/basketballhoop.png"
},
"1": {
"id": "1",
"price": "309",
"quantity": "1",
"thumb": "img\/store\/comp-08.png"
}
};
答案 0 :(得分:5)
您的订单中需要多少件商品?您可以安全地在Javascript阵列中对10'000个项目进行排序,而不会出现太多速度问题。为什么不使用真正的数组?
您甚至可以为其注入自定义属性,大致类似于
var products = [...];
products.findById = function(id) {
for (var i=0, len=this.length; i<len; i++) {
if (id == this[i].id) return this[i];
}
return null;
};
alert( products.findById(103).price ); // -> 119
并添加预定义的分拣机,如
products.sortById = function() {
this.sort(function(a,b) {
return a.id - b.id;
});
};
products.sortById(); // sort array by product id
** 编辑 **
在你的PHP方面,你可能会有类似的东西:
$products = array(
2 => array( 'id' => 2, ... ),
103 => array( 'id' => 103, ... ),
1 => array( 'id' => 1, ... ),
);
// get a JSON array
$jsonArray = json_encode(array_values($products));
将返回您需要的内容。
** 注意 **
在阵列中添加新项目时,不应显式设置索引。使用数组的push
函数,如
products.push({id:123, price:200.49, quantity:1, thumb:'/path/to/file'});
删除项目有点棘手,例如:
products.removeById = function(id) {
for (var i=0, len=this.length; i<len; i++) {
if (id == this[i].id) return this.splice(i, 1)[0];
}
return null;
};
products.removeById(123); // -> returns the removed element! or null if nothing was removed
请参阅演示here(使用Chrome开发工具进行控制台输出)。
答案 1 :(得分:4)
JavaScript和JSON中有两种类型的集合:
根据定义,只能对数组进行排序。使用数组。
答案 2 :(得分:2)
递归解决方案,但不处理数组,javascript
var alphabetizeJSON = function(obj){
var key,
array = [],
stringifiedValuesObj = {},
jsonKeyVal = "",
i,
keyName;
for (key in obj) {
if (typeof obj[key] === "object"){
stringifiedValuesObj[key] = "" + alphabetizeJSON(obj[key]);
} else {
obj[key] = obj[key].replace(/\"/gi,'\\\"');
}
array.push(key);
}
array.sort();
for (i = 0; i < array.length; i++){
keyName = array[i];
jsonKeyVal += '"' + keyName + '": ';
jsonKeyVal += stringifiedValuesObj[keyName] ? stringifiedValuesObj[keyName] : '"' + obj[keyName] + '"';
if (i < array.length - 1 ) {
jsonKeyVal += ',';
}
}
return '{ ' + jsonKeyVal + '}';
};
答案 3 :(得分:0)
查看JSONArray
s。它们可能就是你所需要的。 http://json.org/java/
答案 4 :(得分:0)
事实上,你应该可以使用数组而不是对象来完成这项工作,这将解决你的很多困难。
如果你不能这样做,你可以将对象转换成一个数组来给它排序......就像这样:
var a = []
for (var p in obj) {
a[+p] = obj[p]
}
如果你不能这样做,你可以按照你想要的顺序动态地将信息添加到页面中(以下是一个坏主意)......
for (var i = 0; i < 10000; i++) {
if (obj[i] !== undefined) {
add_to_page(obj[i]) //define this somewhere
}
}