【问题标题】:Create JSON array with different number of elements?创建具有不同数量元素的 JSON 数组?
【发布时间】:2015-05-26 20:49:51
【问题描述】:

我想做的是创建一个具有不同数量元素的 JSON。

json = [
    {
        key: "test",
        values: [
            {
                "label" : "A" ,
                "value" : 29
            } ,
            {
                "label" : "B" , 
                "value" : 0
            } ,........

values 将包含的元素(和信息本身)的数量并不总是相同的。

  1. 如何将元素(或数组?)“推送”到“值”中?
  2. 如何创建一个数组,其中元素具有与“值”相同的结构?

【问题讨论】:

  • 关于 JSON 与对象的注意事项:JSON 是字符串而不是对象,因此它是 JavaScript O 的缩写bject Notation。您所拥有的通常称为 POJO 或 Plain Old Javascript Object。它们不一样。前者是一种类似于 YAML 或 XML 的数据交换格式,而后者是具有属性和值的实际对象。
  • 好的,谢谢!
  • @Amwiom 是的,但它在 JavaScript 中使用字符串表示。如果您继续阅读评论,我确实提到这是一种数据交换格式。

标签: javascript html arrays json


【解决方案1】:

我已经添加了第二个我忘记添加的问题,你也有答案吗?

如何创建元素与“值”具有相同结构的数组?

你需要这样的数组和object

var values = [];
var obj = {};                     // line 1
obj.label= 'desired value';       // line 2
obj.value= 'desired value';
values.pust(obj);                 //line 3  

如果要在数组中插入多个,可以将line1-line3 放入循环中。

【讨论】:

    【解决方案2】:

    您的values 键指向array。如果 never 发生变化(意味着值将始终是一个数组),那么您尝试添加什么并不重要。无论是数组、对象还是元素都可以使用.push()

    json[0].values.push(new_element_or_array_variable);
    

    如果你想重新创建一个与 value 具有相同结构的数组,那么知道它是如何构建的通常会更好,但假设你盲目地进入。

    var json = [{
        key: "test",
        values: [{
            "label": "A",
                "value": 29
        }, {
            "label": "B",
                "value": 0
        }]
    }];
    
    var struct = json[0].values.map(function (a, b) {
        if (typeof a === 'object') {
            var obj = {};
            for (var key in a) {
                if (a.hasOwnProperty(key)) {
                    obj[key] = -1;
                }
            }
            return obj;
        }
    });
    
    console.log(struct);
    

    那么你就有了一个包含空对象的值的副本。

    Demo


    在此处更新:

    //...
    for (var key in a) {
                if (a.hasOwnProperty(key)) {
                    obj[key] = -1;
                }
            }
    //...
    

    您执行的 Evey 循环(在上面的代码中)将一个一个地访问对象中的每个键。因此,在第一个循环(= 迭代)中,键将包含“标签”,在第二次迭代中,它将包含“值”。为确保您只考虑第一个对象的结构而不考虑其余部分,只需执行以下操作:

    if (typeof a === 'object' && b == 0) {
            var obj = {};
            for (var key in a) {
                if (a.hasOwnProperty(key)) {
                    obj[key] = -1;
                }
            }
            return obj;
        }
    

    其中aobjectbobjectvalues array 中的索引。


    还要注意我的 map 函数只检查它是否是一个对象(使用 typeof )。如果你有整数、字符串或数组,你应该检查它们的类型并确定你想用它们做什么。

    你可以这样做:

        if (typeof a === 'object') {
            //... code here
        }else{
          return a;
        }
    

    【讨论】:

    • 我猜用户想要推送 inplace 很多元素,即使用 json[0].values = json[0].values.concat(hisArray) 或 json[ 0].values.push.apply(json[0].values, hisArray) 或简单的 json[0].values.push('value1',{someOtherValue:2})
    • 谢谢 Grimbode,我已经添加了第二个我忘记添加的问题,您也有答案吗?
    • 首先,谢谢!其次,为什么需要 if (typeof...)?如何访问“标签”和“价值”?因为“键”既是标签又是值。但我想为它们设置不同的值。
    • @user3549524 啊我犯了一个小错误。我会用正确的信息稍微更新一下这个问题。为了清楚起见,在for循环的第一次迭代中:key实际上首先引用了label,然后在循环的第二次迭代中它引用了value。需要 Typeof 是因为想象一下您的 values 数组是否包含对象以外的其他内容。如果你只发回对象,那么你就不需要它了。
    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    相关资源
    最近更新 更多