[英]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.