【问题标题】:converting a two dimensional javascript array to JSON将二维 javascript 数组转换为 JSON
【发布时间】:2011-09-22 23:08:32
【问题描述】:

我尝试了几种不同的 json 方法(stringify、toJSON,可能还有一些完全不相关的其他方法),但似乎无法弄清楚如何将其字符串化,因此我可以将其传递给 php 脚本。我能够创建一个二维数组,可以这样表示:

array(
    'image'=>array(
        0=>'hello.jpeg', 
        1=>'goodbye.jpeg', 
        2=>'etc.jpeg'),
    'resume'=>array(
        0=>'resume.doc'),
    'reel'=>array(
        0=>'reel.mov')
    )

当我使用dump 函数将其打印到控制台时,该数组看起来还不错。我试图弄清楚如何让它与对象一起使用,因为我认为我读到了一些说对象已经对 JSON 友好的东西,但是由于我对 javascript 不是很熟悉,所以我非常困惑。

编辑:更多细节......我的数组的声明(当我让它工作时)是这样的,虽然我可能搞砸了:

var fileArray = [];
fileArray['image'] = [];
fileArray['resume'] = [];
fileArray['reel'] = [];

var type;
var name;

var divs = $("#upload-container").children('div');

$.each(divs, function() {
    type = $(this).attr('id');
    name = $(this).html();

    fileArray[type].push(name);
});

【问题讨论】:

  • 你确定你的意思是外部结构是一个数组吗?
  • 我想是的。如果 var 被命名为 fileArray,那么每个元素将类似于 fileArray['image'][0], fileArray['image'][1], fileArray['image'][2], fileArray['resume'] [0] 和 fileArray['reel'][0].
  • 我问是因为通常我们会为此使用对象,而不是数组。
  • 是的,部分问题在于声明对象并混淆了语法。相当于我想在 php 中做的事情是这样的: foreach($unimportant as $key => $var) { fileArray[$key][] = $var; },其中在“关键”分支下分类有多个“变量”。
  • 但是... JavaScript 不是 PHP。

标签: php javascript jquery arrays json


【解决方案1】:

该数组结构的对象在 JavaScript 中可能如下所示:

var objects = 
[
    {
        'image': [
            { '0': 'hello.jpeg' },
            { '1': 'goodbye.jpeg' },
            { '2': 'etc.jpeg' }
        ]
    },
    {
        'resume': [
            { '0': 'resume.doc' }
        ]
    },
    {
        'reel': [
            { '0': 'reel.mov' }
        ]
    }
]

所以现在你有一个由三个对象组成的数组,每个对象都包含一个属性(图像、简历、卷轴),它是另一个对象数组,基本上是键:值对 ('0':'hello.jpeg')。也许您可以通过不使用索引来简化它:

var objects = 
[
    {
        'image': [ 'hello.jpeg', 'goodbye.jpeg', 'etc.jpeg' ]
    },
    {
        'resume': [ 'resume.doc' ],
    },
    {
        'reel': [ 'reel.mov' ]
    }
]

然后你可以使用JSON.stringify(objects) 传递给你的 PHP 动作。

【讨论】:

  • 即使是简化版,也比问题中的结构复杂。为什么你想要一个对象数组,其中每个对象只有一个属性?我的答案中的结构直接与问题中的结构相匹配...
  • 我认为理想情况下我想要一个具有 fileType 属性和 name 属性的对象数组
  • @nnnnnn:OP 在 PHP 方面的目标是创建一个关联数组的数组。上面的简化版本基本上就是这样,除了你不能在 JavaScript 中做关联数组(因此是丑陋的大对象结构)。您的示例可以正常工作,我只是想匹配 PHP 中的数组结构。
【解决方案2】:

您在 PHP 端的示例预期输出有一个包含数值数组的关联数组。 JavaScript 数组具有数字索引:如果您希望字符串作为键,请使用普通对象而不是数组,因为 JavaScript 对象的行为类似于您从 PHP 中想到的关联数组。对应的 JavaScript 对象应如下所示:

var fileArray = {
  'image' : [ 'hello.jpeg',
             'goodbye.jpeg',
             'etc.jpeg'],
  'resume' : [ 'resume.doc' ],
  'reel' : [ 'reel.mov' ]
};

在用方括号定义的数组中,数字索引是隐含的。请注意,fileArray 是用花括号而不是方括号定义的,因此不是数组(尽管它的名称)。如果您想一次设置一个属性,这仍然允许您使用 fileArray['image'] = ... 语法:

var fileArray = {}; // an object, not an array
fileArray['image'] = [];
fileArray['resume'] = [];
fileArray['reel'] = [];  

请注意,初始声明中的大括号使其成为对象,但仍使用方括号语法访问属性。

您将fileArray 定义为带有方括号的JavaScript 数组的方式仍然允许您添加基于字符串的键属性,因为数组 对象,但JSON 字符串化例程可能会忽略这些属性,并且只序列化数字索引的属性。

【讨论】:

  • 这将如何动态声明呢? push 不适用于我的对象。
  • 但是你不是在推对象,你是在推对象属性中存储的数组。
  • 如果您将 fileArray 的初始声明更改为 var fileArray = {},您的代码应该可以正常工作。接下来的三行添加属性imageresumereel,每一个都是一个数组。在您的 .each 循环中,fileArray[type] 访问其中一个数组,fileArray[type].push(name); 将名称值推送到相关数组中。
  • 是的,做到了。 ignacio,nnnnnnnnnnnnnnnnn,非常感谢!
猜你喜欢
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2015-10-15
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多