jQuery.parseJSON无序数组

时间:2014-10-10 07:34:49

标签: javascript php jquery arrays json

初始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
)

在下面的代码中, comparative_attr 包含json编码数组。 之后,因为我 console.log(comparative_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);
}

问题:我希望在我解析JSON之后以相同的顺序实现它。

获得的结果:

First Console.log(equivalent_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...}

enter image description here

已修改

我发现的是,它根据我的属性id缩短,我需要的顺序与数组中的顺序相同。

2 个答案:

答案 0 :(得分:3)

当您将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)
));

答案 1 :(得分:0)

Javascript的json对象顺序依赖于inplementation。您可以在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]项的数组中。

希望这有帮助。