【问题标题】:Can't access array by named key in JavaScript无法通过 JavaScript 中的命名键访问数组
【发布时间】:2017-03-07 02:46:02
【问题描述】:

我需要将对象数组作为更大数据结构的一部分传递给 php 页面。我正在尝试在 JavaScript 中复制此结构并通过 json 传递它。

php 中的数组键已设置为我稍后需要的名称。

我知道 JavaScript 不使用关联数组,并且 JavaScript 中的数组本质上是对象,但文档建议我应该能够使用命名键。

如果是这种情况,我还应该能够通过使用不同的语法将变量用作命名键。

那么有人可以告诉我我做错了什么吗?

示例 1:数字键(有效)

var dataTargets = [];
var obj = {
  'test': 'test'
};
dataTargets["0"] = obj;
alert(JSON.stringify(dataTargets));

示例 2:命名键(失败)

var dataTargets = [];
var obj = {
  'test': 'test'
};
dataTargets["test"] = obj;
alert(JSON.stringify(dataTargets));
//outputs []

示例 3:变量键(失败)

var dataTargets = [];
var dtname = "test";
var obj = {
  'test': 'test'
};
dataTargets[dtname] = obj;
alert(JSON.stringify(dataTargets));
//outputs []

【问题讨论】:

  • 请问为什么JSON.stringify() 返回一个没有设置元素的数组?预期的结果是什么?
  • 你可以试试:dataTargets = {}; dataTargets['test'] = obj;

标签: javascript arrays object key named


【解决方案1】:

属性实际上被正确分配给每个数组;问题是JSON.stringify 忽略了数组的所有非索引属性(将它们更像列表而不是对象)。如果要在对象中使用命名键,则必须使用普通对象 {} 而不是数组 []

var alert = console.log.bind(console) // for demo purposes


// Example 1: numeric keys 

var  dataTargets = {};
var obj = {'test':'test'};
dataTargets["0"] = obj;
alert(JSON.stringify(dataTargets));


// Example 2: named keys

var  dataTargets = {};
var obj = {'test':'test'};
dataTargets["test"] = obj;
alert(JSON.stringify(dataTargets));


// Example 3: variable keys 

var  dataTargets = {};
var dtname = "test";
var obj = {'test':'test'};
dataTargets[dtname] = obj;
alert(JSON.stringify(dataTargets));
//outputs []

【讨论】:

  • 谢谢你的回答,它澄清了我试图解决的两件事(我是正确分配值还是 JSON.stringify 不接受它,因为键不是数字)。作为参考,我将修改接收数据的 php 页面上的对象,使其具有附加属性,而不是使用键。再次感谢:-)
【解决方案2】:

你所做的实际上是这样的

例子1:

var  dataTargets = [];
var obj = {'test':'test'};
dataTargets[0] = obj;
alert(JSON.stringify(dataTargets));
// outputs [{test:test}]

你需要的是:

var  dataTargets = {};
var obj = {'test':'test'};
dataTargets["test"] = obj;
alert(JSON.stringify(dataTargets));
//{"test":{{test:test}}}

因为array 需要通过索引访问。 object 可以满足您的需求

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 2015-12-07
    • 2016-03-11
    • 2013-09-02
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多