Json String :(回复)
{"19":{"id":"19","name":"Product","sku":123,"price":"59.50","cost":"25.00"},"20":{"id":"20","name":"Test","sku":456,"price":"50.00","cost":"40.00"}}
JavaScript代码:
var json = $.parseJSON(response);
var items = new Array();
$.each(json, function(index, value){
items[index] = value.id;
});
console.log(items);
// returns [ , , , , , , , , , , , , , , , , , , , 19, 20 ]
我有一个JSON对象,它最初是从php数组构建的,并使用json_encode进行转换。当我遍历对象 - 基于某些值构建一个新数组时,它与所有第一个项一样为null,然后最后两个具有实际的id。
任何想法我做错了什么?
答案 0 :(得分:2)
这是因为您正在为items
使用数组。设置items[19]
时,需要先设置值0-18(这些是“空”值)。这是因为JavaScript没有关联数组,只有数字。
请尝试使用items
的对象。
var items = {};
$.each(json, function(index, value){
items[index] = value.id;
});
console.log(items); // {19: 19, 20: 20}
P.S。数组中的“null”项实际上是undefined
。
答案 1 :(得分:2)
在使用对象的索引时,您将创建一个稀疏数组。该对象具有名为“19”和“20”的属性,当您将它们用作数组中的索引时,您将从属性中获取值。
如果您想要从数组的开头打包项目,只需push
:
$.each(json, function(index, value){
items.push(value.id);
});
结果items
:
[ "19", "20" ]
答案 2 :(得分:1)
如果可能,您还可以将JSON响应更改为数组:
[
{"id":"19","name":"Product","sku":123,"price":"59.50","cost":"25.00"},
{"id":"20","name":"Test","sku":456,"price":"50.00","cost":"40.00"}
]
答案 3 :(得分:0)
来自MDN:
当属性是有效的数组索引并且该索引超出数组的当前边界时,在JavaScript数组上设置属性时,数组将增大到足以容纳该索引处的元素的大小,并且引擎将相应地更新数组的长度属性:
您正在将数组[19]设置为一个值,因此数组[0-18]变为未定义。
要解决此问题,请将项目声明为对象,可以在不自动填充较低范围的情况下指定数字属性。