使用map将字符串转换为对象中嵌套值的日期

时间:2016-12-08 21:14:02

标签: javascript jquery

我有一个如下所示的数据对象:

[{
  "key": "K1204",
  "values": [{
    "key": "Both",
    "values": [{
      "key": "2015-01",
      "values": 27927.7349421797
    }, {
      "key": "2015-02",
      "values": 27927.7349421797
    }, {
      "key": "2015-03",
      "values": 27927.7349421797
    }]
  }, {
    "key": "Only 1",
    "values": [{
      "key": "2015-01",
      "values": 289819.9054
    }, {
      "key": "2015-02",
      "values": 289819.9054
    }, {
      "key": "2015-03",
      "values": 289819.9054
    }]
  }]
}, {
  "key": "test",
  "values": [{
    "key": "Both",
    "values": [{
      "key": "2015-01",
      "values": 1602.24390394729
    }, {
      "key": "2015-02",
      "values": 1602.24390394729
    }, {
      "key": "2015-03",
      "values": 1602.24390394729
    }]
  }, {
    "key": "Only 1",
    "values": [{
      "key": "2015-01",
      "values": 0
    }, {
      "key": "2015-02",
      "values": 0
    }, {
      "key": "2015-03",
      "values": 0
    }]
  }, {
    "key": "Only 2",
    "values": [{
      "key": "2015-01",
      "values": 104732.0298
    }, {
      "key": "2015-02",
      "values": 104732.0298
    }, {
      "key": "2015-03",
      "values": 104732.0298
    }]
  }]
}]

我正在尝试将key中的日期字符串转换为日期,但我无法让我的代码生效...

这是我到目前为止所做的:

get_scn_cst_data().then(function(costByScn) {
  var data2 = []
  for(i = 0; i < costByScn.length; i++) {
    var envs = costByScn[i]
    for(j = 0; j < envs.length; j++) {
      envs[j].["values"].map(function(data) {
        data["key"] = new Date(data["key"]).getTime();
        data2.push(data);
      });
    }
  }
  console.log("data2: ", JSON.stringify(costByScn));
  $scope.data_costByScn = costByScn;
});

我认为我在正确的轨道上,但循环似乎没有正常工作......

我遇到的唯一错误是:Error: [ng:areq] http://errors.angularjs.org/1.5.5/ng/areq?p0=comparisonReportsController&p1=not%20aNaNunction%2C%20got%20undefined

- - - - - - - - 编辑

这样试试,没有运气:

get_scn_cst_data().then(function(costByScn){

                var data2 = []

                for(i=0;i<costByScn.length;i++) {

                    var envs = costByScn[i]

                    for(j=0;j<envs.length;j++) {

                        data2.push(envs[j].["values"].map(function(data) {
                            data["key"] = new Date(data["key"]).getTime();
                            return data;
                        }));
                    }
                }

                console.log("data2: ", JSON.stringify(costByScn));

                $scope.data_costByScn =   costByScn;

})

5 个答案:

答案 0 :(得分:1)

很好的功能性方法:

var dates = [];

costByScn.forEach(function(scn) {
  scn.values.forEach(function(value) {
    value.values.forEach(function(value2) {
      dates.push(new Date(value2.key));
    });
  });
});

答案 1 :(得分:1)

以下是您的第一个代码示例的更新版本的小提琴:https://jsfiddle.net/q9e6mc6m/2/

有些事情可以解释为什么你的解决方案无效:

var envs = costByScn[i]

应该是

var envs = costByScn[i].values;

因为你试图迭代values数组。否则envs{ key: "..", values: {}}的对象,您无法使用for循环。这有点令人困惑,因为数据结构具有相同名称的嵌套键(values.values)。

这一行:

data2.push(envs[j].["values"].map(function(data) {

有一段额外的句点.它应该是envs[j]["values"]

答案 2 :(得分:1)

我希望这会有所帮助:

for(i = 0; i < costByScn.length; i++) {
  for(j = 0; j<costByScn[i].values.length; j++) {
    var envs = costByScn[i].values[j];
    costByScn[i].values[j].values = envs.values.map(function(env) {
    var obj = env;
    obj.key = new Date(obj.key).getTime();
    return obj;
  })
  }
}
console.log("data2: ", JSON.stringify(costByScn));

答案 3 :(得分:0)

尝试这样的事情:

        let obj = JSON.parse('[{    "key": "K1204", "values": [{        "key": "Both",      "values": [{            "key": "2015-01",           "values": 27927.7349421797      }, {            "key": "2015-02",           "values": 27927.7349421797      }, {            "key": "2015-03",           "values": 27927.7349421797      }]  }, {        "key": "Only 1",        "values": [{            "key": "2015-01",           "values": 289819.9054       }, {            "key": "2015-02",           "values": 289819.9054       }, {            "key": "2015-03",           "values": 289819.9054       }]  }]}, {  "key": "test",  "values": [{        "key": "Both",      "values": [{            "key": "2015-01",           "values": 1602.24390394729      }, {            "key": "2015-02",           "values": 1602.24390394729      }, {            "key": "2015-03",           "values": 1602.24390394729      }]  }, {        "key": "Only 1",        "values": [{            "key": "2015-01",           "values": 0     }, {            "key": "2015-02",           "values": 0     }, {            "key": "2015-03",           "values": 0     }]  }, {        "key": "Only 2",        "values": [{            "key": "2015-01",           "values": 104732.0298       }, {            "key": "2015-02",           "values": 104732.0298       }, {            "key": "2015-03",           "values": 104732.0298       }]  }]}]');

        for (idx = 0; idx < obj.length; idx++){
            for (idxV = 0; idxV < obj[idx].values[0].values.length; idxV++){
                console.log(obj[idx].values[0].values[idxV].key);
            }
        }

答案 4 :(得分:0)

不可变,纯粹的功能,易于测试和推理:

const convertYearMonthStringToDateObject =
    (yearMonthString) => new Date(yearMonthString)

const transformItemProperty = (arr, property, transformFn) => arr.map(
    (item) => Object.assign({}, item, {[property]: transformFn(item[property])})
)

const mapKeys = (arr) =>
    transformItemProperty(arr, 'key', convertYearMonthStringToDateObject)
const mapValues = (arr) => transformItemProperty(arr, 'values', mapKeys)
const convertData = (arr) => transformItemProperty(arr, 'values', mapValues)