如何使用jquery将元素添加到json的一部分

时间:2014-06-11 07:55:22

标签: javascript jquery json

我尝试以特定方式将元素添加到以下JSON:

var data = [{"name":"google",
             "ip":"10.10.10.01",
             "markets":[{"name":"spain","county":"6002,6017,6018,6019,6020"},
                        {"name":"france","county":"6003,6005,6006,6007,6008,6025,6026,6027,6028,6029"},
                        {"name":"japan","county":"6004,6021,6022,6023,6024"},
                        {"name":"korea","county":"6000,6013,6014,6015,6016"},
                        {"name":"vietnam","county":"6001,6009,6010,6011,6012"}]},
            {"name":"amazon",
             "ip":"10.10.10.02",
             "markets":[{"name":"usa","county":"10000,10001,10002,10003,10004,10005"}]},
            {"name":"yahoo",
             "ip":"10.10.10.03",
             "markets":[{"name":"japan","county":"10000"}]}];

我想将此元素添加到json:

newData = [{"name":"amazon",
            "ip":"10.10.10.02",
            "markets":[{"name":"mexico","county":"9000"}]}];

结果可能就是这样:

var data = [{"name":"google",
             "ip":"10.10.10.01",
             "markets":[{"name":"spain","county":"6002,6017,6018,6019,6020"},
                        {"name":"france","county":"6003,6005,6006,6007,6008,6025,6026,6027,6028,6029"},
                        {"name":"japan","county":"6004,6021,6022,6023,6024"},
                        {"name":"korea","county":"6000,6013,6014,6015,6016"},
                    {"name":"vietnam","county":"6001,6009,6010,6011,6012"}]},
            {"name":"amazon",
             "ip":"10.10.10.02",
             "markets":[{"name":"usa","county":"10000,10001,10002,10003,10004,10005"},
                        {"name":"mexico","county":"9000"}]},
            {"name":"yahoo",
             "ip":"10.10.10.03",
             "markets":[{"name":"japan","county":"10000"}]}];

我试图使用:

$.extend(data.markets, newData)

$.extend(true, data, newData); //这仅适用于每个元素都是新元素的情况。

但是没有什么能像我假装的那样起作用。

有人能给我一个解决方案吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您有一个对象数组,其中每个对象如下所示:

var item = {"name":"...",
            "ip":"...",
            "markets":[ /*some objects here*/];
}

那么为什么不创建自定义方法来插入元素呢?如果存在具有相同名称和ip的项目,它可以在数组中搜索,然后:

  • 如果确实存在:将市场附加到现有项目市场属性(可能需要再次检查它们是否已存在)。 更新:@jasonscript在his answer中添加的代码将完成这项工作:一旦找到了添加市场的位置,只需将其添加到数组即可。同样,也许您必须检查该市场是否已经在阵列中。使用jQuery将是:$.extend(true, data[i],newData)
  • 如果它不存在:只需将该项添加到数组中:$.extend(true, data,newData)

答案 1 :(得分:2)

您还没有创建JSON,您已经创建了一个JavaScript文字对象。

您可以通过

添加此特定的新数据
data[1].markets.push({"name":"mexico","county":"9000"})

因为您正在处理javascript对象,所以您可以编写一个函数来检查data [n]和push数据是否存在。

答案 2 :(得分:0)

another answer窃取一些代码:

$.each(data, function(item){
    if(item.name == newData[0].name && item.ip == newData[0].ip) {
        item.markets.push.apply(item.markets, newData[0].markets);
    }
}

这假设你知道新对象中的所有市场项目都与现有市场项目不同 - 否则你必须做一个嵌套的foreach或其他东西。如果你可以稍微改变对象的符号,你可以考虑using a dictionary-like object for Markets使它更清洁。

事实上,从关联数组中更改data也可能适用于此。然后你可以轻松检查存在:

if(data[myNewDataName]){
    //add to markets
} else {
    data[myNewDataName] = myNewData;
}