【问题标题】:How do I add values to semi-complex JSON object?如何向半复杂 JSON 对象添加值?
【发布时间】:2012-03-21 10:57:25
【问题描述】:

我对使用 JSON 对象还很陌生,我有点卡住了。

我有一个从这个数组转换而来的 JSON 对象:

Array
(
    [status] => success
    [id] => 1
    [name] => Zone 1
    [description] => Awesome zone deze..
    [tiles] => Array
    (
        // Column for the tile grid
        [0] => Array
            (
                // Row for the tile grid
                [0] => Array
                    (
                        [tileID] => 1
                        [rotation] => 0
                    )
                [1] => Array
                    (
                        [tileID] => 1
                        [rotation] => 0
                    )
                // Etc..
            )
        [1] => Array // etc.. etc..
    )
)

我使用这个对象为我的 HTML5 Canvas 游戏渲染出一个等距网格。我正在构建一个地图编辑器并在地图上放置更多图块,我必须向这个 json 对象添加值。

这就是我在 PHP 中的做法:

mapData[column][row] = array(
    'tileID' => 1,
    'rotation' => 0
);

所以我的问题是,如何在 javascript 中使用 JSON 对象来实现这一点?

提前致谢!

尼克

更新

我遇到了一个错误:

can't convert undefined to object
mapDataTiles[mouseY][mouseX] = { tileID: editorSelectedTile, rotation: 0 };

这是我用于单击并将新图块保存到 JSON 对象的代码。起初我虽然我的一个参数是'未定义',所以我将它们记录到控制台,但它们完美地出来了..

// If there is already a tile placed on these coordinates
if( mapDataTiles[mouseX] && mapDataTiles[mouseX][mouseY] )
{
    mapDataTiles[mouseX][mouseY]['tileID'] = editorSelectedTile;
}
// If there is no tile placed on these coordinates
else
{
    mapDataTiles[mouseX][mouseY] = { tileID: editorSelectedTile, rotation: 0 };
}

我的变量有以下值:

MouseX: 5
MouseY: 17 
tileID: 2

另外一个奇怪的事实是,对于某些坐标,它确实可以工作并将新数据保存到数组中。

更新 2

经过几个小时的反复试验和错误编码,我想出了一个解决方案!

还是感谢大家的帮助!

如果有人好奇,我很乐意展示我的代码。到目前为止,我所拥有的是能够向任何方向扩展世界地图以获得无限数量的瓷砖。 :D

Cya

【问题讨论】:

    标签: javascript json object add


    【解决方案1】:

    嗯,几乎是一样的。 JavaScript 对象是最简单的更改对象之一 :)

    jsonObject.tiles[column][row] = {tileID: 1, rotation: 0};
    

    【讨论】:

    • 我已经尝试过了,但我遇到了一个奇怪的错误,见上文。不过感谢您这么快回答!
    • 您必须确保列或行数组确实存在 - 它们不是动态创建的。您应该更改“else”子句以检查数组是否存在,如果不存在,则在给定的列/行创建一个数组。
    【解决方案2】:

    如果要添加一行:

    mapData.tiles.push([
    {
        'tileID': 1,
        'rotation': 0
    },
    {
        'tileID': 3,
        'rotation': 0
    }]);
    

    如果您想在现有行中添加一列:

    mapData.tiles[row].push({
        'tileID': 1,
        'rotation': 0
    });
    

    【讨论】:

    • 但如果我这样做,我将无法再控制“列”,这很重要。对吗?
    • 这就是创建行和列的方式。要访问它们,请使用 Saebekassebil 方法。
    • 不,你不明白我的意思。如果我这样做“mapData.tiles[row].push(..”我无法控制 [col] 键,这是至关重要的。如果我这样做,它只会添加一列并给它一个索引基于它的 predececors。我最终这样做了:mapData[row] = new Array(); mapData[row][col] = { tileID: 1 }
    猜你喜欢
    • 2017-08-04
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2019-08-13
    • 2016-04-30
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多