【问题标题】:how to construct a json object using info from several javascript arrays如何使用来自多个 javascript 数组的信息构造 json 对象
【发布时间】:2009-12-10 00:15:44
【问题描述】:

我已经有两个 js 数组,比如说:名称和值(长度相同),现在我想以某种格式构造一个 json 对象?例如:

 names = ["label1","label2","label3"];
 values = [[[0,1],[1,9],[2,10]],[[0,89],[1,91],[2,1]],[[0,1],[1,9],[2,10]]];

我想要一个json数组data_spec,格式如下:

 [{
    label:"label1",
    data:[[0,1],[1,9],[2,10]]
  },
  {
    label:"label2",
    data:[[0,89],[1,91],[2,1]]
  },
  {
    label:"label3",
    data:[[0,1],[1,9],[2,10]]
  }]

谁能告诉我怎么做?非常感谢!

【问题讨论】:

    标签: javascript arrays json


    【解决方案1】:

    对于一些品种和检查,

    var data_spec = [];
    if (names.length != values.length) {
        // panic, throw an exception, log an error or just return an empty array
    } else {
        for (var i=0, name; name = names[i]; i++) { // assuming a non-sparse array
            data_spec[i] = { 
                label : name, 
                data  : values[i] 
            };
        }
    }
    

    也就是说,非稀疏并且不包含任何其他会评估为false的内容。

    如果你的框架有一个 each 函数添加到 Array 并且你不关心性能,

    var data_spec = [];
    names.each(function(name) {
        data_spec.push({ label : name, data : values[names.indexOf(name)] });
    });
    

    如果你的框架是像 Dojo 这样干净的框架并将其放在其他地方(例如 Dojo),

    var data_spec = [];
    dojo.forEach(names, function(name) {
        data_spec.push({ label : name, data : values[names.indexOf(name)] });
    });
    

    如果您的框架有一个 each 函数,该函数返回一个长度相同的数组,每个操作的结果都在其预期位置,

    var data_spec = arrayOfResultsEach(names, function(name) {
        return { label : name, data : values[names.indexOf(name)] };
    });
    

    这些只是为了说明,任意长度的循环内的 indexOf 是主要的代码气味。

    【讨论】:

    • 大多数数组迭代器实现(原型、jQuery.each)也将index 参数传递给迭代器函数。所以你不需要indexOf
    【解决方案2】:

    只需使用循环(确保两个数组长度相同)

    result = [];
    for(var i=0, len=names.length; i < len; i++) {
        result.push({label: names[i], data: values[i]});
    }
    

    【讨论】:

    • @Chetan,请通过在循环外计算 names.length 来优化你的 for 循环,我会给你 +1
    • 完成了,但是 Array#length 的成本是否足以打扰?我知道 nodelist#length 是。
    • 我不能确定哪个成本更高,但仅优化就可以减少对 names.length 的调用 N 其中 N 是数组项的数量(其中可能非常昂贵)
    • 我更喜欢 for (var i=0; names[i]; i++) {} 这样的情况,当您知道 names[i] 永远不会是 0、false、null、未定义或空字符串时:-)
    • array.length 不是调用它是对象的属性。更改此代码时找不到优化.. stackoverflow.com/questions/1208320/…
    【解决方案3】:
        var myArray = 
        [{
            "label": "label1",
            "data" : 
            {
                "0": "1",
                "1": "9",
                "2": "10"
            }
        },
    
        {
            "label": "label2",
            "data" : 
            {
                "0": "89",
                "1": "91",
                "2": "1"
            }
        },
    
        {
            "label": "label3",
            "data" : 
            {
                "0": "1",
                "1": "9",
                "2": "10"
            }
        }];
    
        alert(myArray[0].data[2]);
    

    【讨论】:

    • 我很确定提问者正在寻找动态实现/讽刺。另外,为什么要对“数据”使用对象字面量而不是数组?
    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    相关资源
    最近更新 更多