将json响应变为javascript数组

时间:2010-09-09 00:58:35

标签: javascript arrays json

如果我有以下函数迭代json响应对象(val2):

function test(val2){

    jQuery.each(val2.maps, function(j, val3) {    

        maps = new Array({

            id: val2.maps[j].id,
            parent: val2.maps[j].parent,
            image: val2.maps[j].image,
            data: val2.maps[j].data,
            width: val2.maps[j].width,
            height: val2.maps[j].height,
            top: val2.maps[j].top,
            left: val2.maps[j].left                         
        })

    });

return maps
}

如何将其插入类似于以下格式的数组中?目前我只回到最后一个数组项目。

maps = [{
    id: 'south',
    parent: 'us',
    image: '/resources/images/maps/map_south.jpg',
    data: 'popups/region_south.html',
    width: '227px',
    height: '177px',
    top: '120px',
    left: '49px'
},
{
    id: 'east',
    parent: 'us',
    image: '/resources/images/maps/map_east.jpg',
    data: 'popups/region_east.html',
    width: '156px',
    height: '121px',
    top: '120px',
    left: '283px'
}]

干杯

3 个答案:

答案 0 :(得分:1)

当人们在没有解释任何事情的情况下发布答案时总是很有趣在我看来你实际上并不知道你在做什么,所以让我解释一下:

function test(val2){

    // use jQuery.each to apply a function to each element in val2.maps
    jQuery.each(val2.maps, function(j, val3) {    

        // here you create a new global variable called 'maps' and assign and Array to it
        // the constructor 'new Array' is given one argument here
        // which is the object in which you map the values
        // notice: you're always creating a new array with only ONE element
        //         therefore you never fill it up
        maps = new Array({

            // Instead of 'val2.maps[j].id', you could simply do 'val3.id' etc.
            // Since val3 already contains 'val2.maps[j]'
            id: val2.maps[j].id,
            parent: val2.maps[j].parent,
            image: val2.maps[j].image,
            data: val2.maps[j].data,
            width: val2.maps[j].width,
            height: val2.maps[j].height,
            top: val2.maps[j].top,
            left: val2.maps[j].left                         
        }) // missing semicolon here btw ;)

    });

    // this returns the last Array that was created
    return maps
}

这是一个固定版本,它实际上正确地填充了数组:

function test(val2){
    var maps = []; // create an array that's local to this function, so it does not override any global stuff
    jQuery.each(val2.maps, function(j, val3) {    

        // append a new element to the array, this time directly use 'val3'
        maps.push({
            id: val3.id,
            parent: val3.parent,
            image: val3.image,
            data: val3.data,
            width: val3.width,
            height: val3.height,
            top: val3.top,
            left: val3.left                         
        });
    });

    // this time return the array with all the elements
    return maps
}

此外,您的所有代码基本上都没有效果,因为您所做的只是将一个数组的元素复制到另一个数组而不以任何方式更改结构。

因此,最后val2.maps和返回的maps中的值都是“相同的”,唯一的区别是它们没有指向相同的对象,因为您将所有值复制到新的值中

如果您不需要副本,或者希望保留对原始值的引用,则可以执行此操作:

function test(val2) {
    return val2.maps; // return the reference to maps
}

Nick已经展示了一个更复杂的版本来完成整个复制工作,但我认为如果有人真正指出你的错误,而不是发布甚至“更疯狂”的jQuery代码供你复制和粘贴,它可能会帮助你更多; )

PS:爱我的Firefox,Session刚刚崩溃,但重启后我的答案还在这里^ _ ^“

答案 1 :(得分:0)

这样的事情应该做:

var result = [];
jQuery.each(val2.maps, function(j, val3) {    
    maps = result.push({
        id: val2.maps[j].id,
        ...
    });
});

答案 2 :(得分:0)

您可以使用jQuery.map(),如下所示:

function test(val2){
  return jQuery.map(val2.maps, function() {    
    return {
             id: this.id,
             parent: this.parent,
             image: this.image,
             data: this.data,
             width: this.width,
             height: this.height,
             top: this.top,
             left: this.left                         
           };
  }).get();
}

虽然根据格式,似乎val2.maps 已经已经您正在使用的集合,但是您不能直接使用它吗?