Javascript 排序JSON对象
尝试对JSON对象进行排序时遇到问题。基本上,人们可以将任意顺序的产品添加到我们的订单中,但它在摘要中显示的顺序需要是我们希望它们定位的方式(而不是他们选择它们的顺序),因此我需要按“id”排序(或者稍后我们将按“pos”字段排序) 本质上,我需要按id升序排序。1,2103而不是2103,1 我似乎遇到了问题,因为单个对象的索引是数字(或者只是它们在那里的事实…) 我需要沿着array.sort(函数(a,b){returna.id-b.id})的行做一些事情;但我认为这不起作用,因为1,它不是数组(它是一个对象),2,它有那些讨厌的索引(我的代码的另一部分需要这些索引) 有什么想法吗Javascript 排序JSON对象,javascript,jquery,json,sorting,object,Javascript,Jquery,Json,Sorting,Object,尝试对JSON对象进行排序时遇到问题。基本上,人们可以将任意顺序的产品添加到我们的订单中,但它在摘要中显示的顺序需要是我们希望它们定位的方式(而不是他们选择它们的顺序),因此我需要按“id”排序(或者稍后我们将按“pos”字段排序) 本质上,我需要按id升序排序。1,2103而不是2103,1 我似乎遇到了问题,因为单个对象的索引是数字(或者只是它们在那里的事实…) 我需要沿着array.sort(函数(a,b){returna.id-b.id})的行做一些事情;但我认为这不起作用,因为1,它不
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"
}
};
您的订单中需要多少项?您可以在Javascript数组中安全地对10000个项目进行排序,而不会有太多的速度问题。为什么不使用真正的数组呢 您甚至可以向其注入自定义属性,大致如下
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
**编辑**
在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));
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
我会归还你需要的东西
**注意**
在数组中添加新项时,不应显式设置索引。使用阵列的push
功能,如
products.push({id:123, price:200.49, quantity:1, thumb:'/path/to/file'});
但是,删除项目有点棘手,例如:
$products = array(
2 => array( 'id' => 2, ... ),
103 => array( 'id' => 103, ... ),
1 => array( 'id' => 1, ... ),
);
// get a JSON array
$jsonArray = json_encode(array_values($products));
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
products.removeById=函数(id){
对于(var i=0,len=this.length;我返回已删除的元素!如果未删除任何内容,则返回null)
请参阅演示(使用Chrome Developer工具进行控制台输出)。JavaScript和JSON中有两种类型的集合:
根据定义,只能对数组进行排序。使用数组。查看
JSONArray
s。它们可能是您所需要的。实际上,您应该能够使用数组而不是对象来完成此任务,这将解决您的许多困难
如果您不能做到这一点,您可以将对象转换为一个数组,为其提供排序…类似于以下内容:
var a = []
for (var p in obj) {
a[+p] = obj[p]
}
如果您不能做到这一点,您可以按照您想要的顺序动态地将信息添加到页面中(以下是一个坏主意)
for(变量i=0;i<10000;i++){
if(obj[i]!==未定义){
将_添加到_页面(obj[i])//在某处定义它
}
}
递归解决方案,但不处理数组,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 + '}';
};
var alphalozejson=function(obj){
var键,
数组=[],
stringifiedValuesObj={},
jsonKeyVal=“”,
我
关键词;
用于(输入obj){
if(对象类型[键]=“对象”){
stringifiedValuesObj[key]=“”+字母JSON(obj[key]);
}否则{
obj[key]=obj[key]。替换(/\“/gi,\\\”);
}
array.push(按键);
}
array.sort();
对于(i=0;i
对象本质上是无序的(即属性包没有“排序”);您期望的结果是什么?我认为他将对象用作关联数组,而不是“稀疏数组”,这是他真正想要的。使用一个对象数组。另外,签出underline.js。这很好。最多可能有20个…好吧,PHP有一个函数将关联数组转储到js数组中,还是我只创建一个?目前我只使用json_encode PHP有json_encode()如果所有索引都是整数,它将返回一个Javascript数组(请参阅手册)。非常感谢Yanick,非常有用:)我使用您的排序器将其工作,并让PHP将其作为对象数组而不是objectsglad对象转储。我可以帮助您。有关更多详细信息,请参阅最新编辑(如果您尚未这样做)再次感谢!我刚刚注意到findBy是我如何找到合适的索引而不是设置它的(在lol之前,它没有被接受)。你能说一下在开始时将我的数组排序到合适的索引中(使用a for products.length newarr[products[I].id]=products[I])这样我就可以通过product[id]访问的性能差异吗与每次更改产品时都运行findById函数相比(速度方面)是更好还是更差?例如,我如何在不知道输出顺序的情况下访问id的价格?例如,我不能只做产品[1][1]是价格还是其他…:\@Benno你只会做产品[1].price所以我的数组应该是这样的?var products=[1:{price:109,name:'Thing'}];因为这似乎不起作用..奇怪的是,我以前从来没有创建过这样的数组lol:\@Benno,使用这个:var a=[];a[1]={price:109,name:'Thing'};
等等。大多数JS实现都使用所谓的稀疏数组,所以你可以创建带有“洞”的数组。一个“稀疏数组”将与使用一个对象完全相同。它的存储方式相同,处理方式相同,length
使用起来不再有意义。那么,你就不会将数组用作数组了。嗯,这实际上很有效。哈哈,赢了!尽管我意识到它是一种浪费资源(尽管它们很小),因此我将首先尝试将其转换为数组,但如果我厌倦了,我会这样做:)我遇到以下错误:ReferenceError:orderJSON未定义
谢谢,已修复。我更改了函数的名称