Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 排序JSON对象_Javascript_Jquery_Json_Sorting_Object - Fatal编程技术网

Javascript 排序JSON对象

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,它不

尝试对JSON对象进行排序时遇到问题。基本上,人们可以将任意顺序的产品添加到我们的订单中,但它在摘要中显示的顺序需要是我们希望它们定位的方式(而不是他们选择它们的顺序),因此我需要按“id”排序(或者稍后我们将按“pos”字段排序)

本质上,我需要按id升序排序。1,2103而不是2103,1

我似乎遇到了问题,因为单个对象的索引是数字(或者只是它们在那里的事实…)

我需要沿着array.sort(函数(a,b){returna.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"
    }
};

您的订单中需要多少项?您可以在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未定义
    谢谢,已修复。我更改了函数的名称