2015-11-03 67 views
3

PHP脚本计算我以下数组:条目添加到对象

$test = Array(); 
$test['a'] = Array(); 
$test['a']['a1'] = 'a1'; 
$test['a']['a2'] = 'a2'; 
$test['b'] = Array(); 
$test['b']['b1'] = 'b1'; 
$test['b']['b2'] = 'b2'; 

我转换这个阵列分成JSON使用:

echo json_encode($test); 

我使用的检索此JSON Ajax调用,我使用我把这个它变成一个JavaScript数组:

test = JSON.parse(data); 

我的问题是:我如何添加条目本阵JavaScript的? 我想:

test['c'] = []; 
test['c']['c1'] = 'c1'; 
test['c']['c2'] = 'c2'; 

但随后在控制台test['c']是空的(Array[0])。

+0

也显示JSON,那么我们不必在我们的头部做json_encoding – mplungjan

+2

'test ['c'] = []; test''c']。push('c1')'; test ['c']。push('c2')';'如果你设置'test ['c']'为数组,使用'.push'要添加数据,设置属性'c1,c2'不会影响其'length',它仍然是一个空数组。如果你想'c1,c2'作为键,把'test ['c']'设置为'object',使用'test ['c'] = {};' – fuyushimoya

+1

@fuyushimoya - 他的代码没有问题或者他这样做的方式 - > http://jsfiddle.net/EJZ48/710/ **如果**当然'测试'实际上_is_是一个对象的第一位。 – davidkonrad

回答

6

这一点之后:

test = JSON.parse(data); 
你不JSON处理了

; test对象

...和我使用的是把这个它变成一个JavaScript数组...

你不把它变成一个JavaScript 阵列,你把它变成一个JavaScript 对象。与PHP的“关联数组”相近的JavaScript是一个对象,而不是数组。

要将属性添加到对象,您只需分配给它们。在你的情况下,你试图创建一个名为c的属性,它是一个具有附加属性的对象。由于我们使用的是对象而非数组,因此在JavaScript中使用的是对象,因此您将使用{}而不是[]创建c。例如:

test['c'] = {}; 
test['c']['c1'] = 'c1'; 
test['c']['c2'] = 'c2'; 

或更简洁:

test.c = {}; 
test.c.c1 = 'c1'; 
test.c.c2 = 'c2'; 

甚至更多简洁:

test.c = { 
    c1: 'c1', 
    c2: 'c2' 
}; 

你在做什么的工作,因为普通的JavaScript数组are really objects所以你可以给它们添加任意的非元素属性,以及以更“常规”的方式使用它们。但在正常情况下,您会使用非数组对象。

但随后在控制台测试[“C”]是空的(阵列[0])

这是因为控制台显示您的物体的阵列状的方面和忽略非阵列方面。但test['c']确实c1c2属性,控制台只是没有显示给你。尽管如此,只有在数组中使用非索引属性名称时,如果您有特定的原因这样做。否则,再次使用非数组对象。

-1

在JavaScript中你不能有命名索引。

http://www.w3schools.com/js/js_arrays.asp

很多编程语言支持与名为指标阵列。具有命名索引的数组 称为关联数组(或散列)。 JavaScript不支持具有命名索引的数组。在JavaScript中, 数组总是使用编号索引。如果您使用命名索引,则JavaScript将重新定义该数组为一个标准对象。之后, 所有数组方法和属性将产生不正确的结果。

+1

是的,你可以。你不应该,但你可以:http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/ – mplungjan

+0

为什么你真的不应该使用w3schools的又一个例子。考虑其他任何参考; [MDN](https://developer.mozilla.org/docs/Web/JavaScript)通常(不是普遍的,但典型的)高标准。 –