繁体   English   中英

jQuery.parseJSON无序数组

[英]jQuery.parseJSON disordered array

初始PHP ARRAY将属性存储为值和键上的相应ID

Array
(
[979] => Pict Model
[962] => Brand
[494] => Dimensions
[980] => Capacity
[981] => Power
[982] => List Price
[983] => Warrenty
[975] => USB Connection
[976] => Self Cleaning
[977] => Double Glass Door
[978] => Steam Function
[974] => Electricity Type
)

在下面的代码中, adorable_attr保存着json编码的数组。 之后,作为我console.log(comparable_attr)这给了我一个顺序为php数组的json。

然后,在我解析JSON然后console.log之后,它以不同的顺序给了我数据。

var comparable_attr = '<?php echo json_encode($_comparable_attributes); ?>';
   if(comparable_attr.length != 0){       //check for empty json
      console.log(comparable_attr);
          var obj = jQuery.parseJSON(comparable_attr);
                console.log(obj);
}

问题:我想在解析parseJSON之后以相同的顺序实现它。

获得的结果:

第一个Console.log(comparable_attr)给出:

{"979":"Pict Model","962":"Brand","494":"Dimensions","980":"Capacity","981":"Power","982":"List Price","983":"Warrenty","975":"USB Connection","976":"Self Cleaning","977":"Double Glass Door","978":"Steam Function","974":"Electricity Type"}

第二个Console.log(obj)给出:

 Object { 494="Dimensions", 962="Brand", 974="Electricity Type", more...}

在此处输入图片说明

编辑

我发现的是,它根据我的属性ID进行了短路,我需要按照与数组中相同的顺序进行操作。

当将PHP备用数组转换为JSON,然后转换为JS变量时,您将获得JS Object而不是数组,并且JS对象明确是一组无序的键值对。

如果您希望保留顺序,则需要首先在PHP端重新排列数据,也许是:

Array(
    Array([979] => Pict Model),
    Array([962] => Brand),
    ...
)

但是请注意,如果这样做,您将失去直接通过键查找数据的功能,因为生成的JS对象看起来像:

[
  { "979": "Pict Model" },  // NB: all JS keys are strings
  { "962": "Brand" },
  ...
]

另一种选择是按原样发送您现有的数组,但也发送仅是键的有序列表的第二个数组。 前者可用于基于键的查找,后者可确定正确的顺序:

json_encode(array(
    'data' => $_comparable_attributes,
    'order' => array_keys($_comparable_attributes)
));

Javascript的json对象顺序取决于填充。 您可以在console尝试:

a = {2:'a', 1:'b'}
Object {1: "b", 2: "a"}

为了解决您的问题,建议您通过以下方式阻止自动排序:

array_reduce(
  $a, 
  function($carry, $item) use(&$a) { 
    $carry[] = [key($a), $item]; next($a); return $carry; 
  }, 
  []
)

这会将您的初始数组包装到包含[key, val]项目的数组中。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM