【问题标题】:How do I iterate over this json structure to produce another structure?如何迭代这个 json 结构以生成另一个结构?
【发布时间】:2016-01-22 18:42:35
【问题描述】:

我有这个 json 结构。

x=[{
    "value": 1.37,
    "date_transacted": "2015-01-01"
}]

从这个json结构,我想生成如下json结构;

y1=[{
    c: [{
        v: "2015-01-01"
    },
    {
        v: "1.37"
    }]
}]

我已经编写了代码来执行此操作。看起来像这样;

var y1 = [{ c:[ {"v":x[0].value}, {"v":x[0].date_transacted} ] }];

x 有多个 json 键/值对时,我的问题就出现了。看起来像这样的东西;

x=[{
    "value": 1.37,
    "date_transacted": "2015-01-01"
},
{
    "value": 1.62,
    "date_transacted": "2015-02-01"
},
{
    "value": 1.83,
    "date_transacted": "2015-03-01"
}]

什么是通过对象数组迭代我的代码以生成应如下所示的所需 json 结构的有效方法?

y=[{
    c: [{
        v: "2015-01-01"
    },
    {
        v: "1.37"
    }]
},
{
    c: [{
        v: "2015-01-02"
    },
    {
        v: "1.62"
    }]
},
{
    c: [{
        v: "2015-01-03"
    },
    {
        v: "1.83"
    }]
}]

【问题讨论】:

    标签: javascript json iteration javascript-objects


    【解决方案1】:
    var y1=[]; 
    for(var i=0;i<x.length;i++){
    
       y1[i]= [{ c:[ {"v":x[i].value}, {"v":x[i].date_transacted} ] }];
    
    }
    

    【讨论】:

    • 谢谢。有用。是否可以使用 map() 函数进行迭代?我在寻找更不寻常的东西。
    【解决方案2】:

    作为一个单一的陈述:

    y = x.map(function(e)
    {
        return {
            c:
            [
                {
                    v: e.value
                },
                {
                    v: e.date_transacted
                }
            ]
        };
    });
    

    【讨论】:

    • 谢谢。这就是我要找的东西!
    【解决方案3】:

    仅当 x 中的对象具有确切的 2 个属性时,其他两个答案才有效。 无论属性数量如何,一种方法:

    y = [];
    for(var i = 0, i < x.length; i++){
        var obj = {c:[]};
        for(var prop in x[i]){
            obj.c.push({v:x[i][prop]})
        }
        y.push(obj);
    }
    

    编辑:使用地图

    y = x.map(function(e)
    {
        var obj = {c: []};
        for(var prop in e){
            obj.c.push({v:e[prop]})
        }
        return obj;
    });
    

    【讨论】:

      【解决方案4】:

      这里的其他答案(@user2415266 除外)不是动态的、硬编码的以接受精确的输入,并且不是特别可重用的。如果您有超过 2 个属性,或者在 @Siguza 的情况下,如果您的属性不是“date_transacted”和“value”,它们将失败。

      function restructureJson(obj) {
          var output = {c:[]};
          for (var i in obj) {
              output.c.push({v:obj[i]});
          }
          return output;
      }
      

      此函数可在任何对象数组、任何大小、包含任意数量的属性上重复使用。

      // Simple example
      var json1 = [{
          "value": 1.37,
          "date_transacted": "2015-01-01"
      }];
      
      // More complex
      var json2 = [{
          "value": 1.37,
          "date_transacted": "2015-01-01",
          "another_value": "test",
          "more": "12356"
      },
      {
          "value": 1.62
      },
      {
          "value": 1.83,
          "date_transacted": "2015-03-01",
          "stuff": "124334654567"
      }];
      
      // Map the function to the arrays
      a = json1.map(restructureJson);
      b = json2.map(restructureJson);
      

      【讨论】:

      • 我刚刚也将带有地图的版本编辑到我的答案中。
      • 为什么在调用a = json1.map(restructureJson);时,不需要在restructureJson()中提供参数?看restructureJson()的函数声明,函数只有一个参数。
      • 因为 map() 的原生 JavaScript Array 方法会自动调用您传递给它的函数,并带有许多参数。即,当它处理您的数组元素并将函数应用于每个元素时,它会自动将元素的值传递给您的函数。见这里:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
      猜你喜欢
      • 2019-11-19
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2017-03-29
      • 2016-11-28
      相关资源
      最近更新 更多