【问题标题】:mapping json object with weird json fields, indexed by number using lodash用奇怪的 json 字段映射 json 对象,使用 lodash 按数字索引
【发布时间】:2015-06-19 03:48:31
【问题描述】:

我正在尝试解析来自服务器的 json 响应。服务器端我无能为力,因为它不能很快改变。

这是他们的 json 响应的样子:

{
    prop[1][foo]: "foo number 1",
    prop[1][bar]: "bar number 1",
    prop[1][bazz]: "bazz number 1",
    prop[2][foo]: "foo number 2",
    prop[2][bar]: "bar number 2",
    prop[2][bazz]: "bazz number 2"
}

现在我希望它是这样的:

{
    props: [
        {foo: "foo number 1", bar: "bar number 1", bazz: "bazz number 1"},
        {foo: "foo number 2", bar: "bar number 2", bazz: "bazz number 2"}
    ]
}

我该怎么做,我不知道如何迭代和设置。

我的尝试:

var temp = [];

var regExp = /\[([^)])\]/;
var matches;
_.each(element, function(value, key) {
    if (key.indexOf('foo') >= 0) {
        matches = regExp.exec(key);
        temp[matches[1]] = value;
    }

});

【问题讨论】:

    标签: javascript arrays json underscore.js lodash


    【解决方案1】:

    我们可以进行字符串操作,因为在 javascript 中使用“eval()”是个坏主意

    var injson = '{prop[1][foo]: "foo number 1",    prop[1][bar]: "bar number 1",    prop[1][bazz]: "bazz number 1",    prop[2][foo]: "foo number 2",    prop[2][bar]: "bar number 2",    prop[2][bazz]: "bazz number 2"}'
    
    injson = injson.replace("{","");
    injson = injson.replace("}","");
    injson = injson.split("\",");
    
    var outarr = [];
    
    for(var index=0;index<injson.length;index++){
        var _key = $.trim(injson[index].split(":")[0]);
        var _value = $.trim(injson[index].split(":")[1]);
        _value = _value.substring(1, _value.length-1);
        var _index = parseInt(_key.substring(_key.indexOf("[")+1).substring(0,1));
        var _prop = _key.substring(_key.indexOf("][")+2, _key.length-1);
        if(!outarr[_index])
           outarr[_index] = {};
        outarr[_index][_prop] = _value;
    };
    console.log(outarr);
    

    类似的东西

    如果你想使用 eval,你可以尝试减少 for 循环内的代码

    【讨论】:

      【解决方案2】:

      您可以使用 _.set(object, path, value),它将评估您为响应对象中的每个值设置的路径。

      DEMO

      Javascript

      var data = {
          "prop[1][foo]": "foo number 1",
          "prop[1][bar]": "bar number 1",
          "prop[1][bazz]": "bazz number 1",
          "prop[2][foo]": "foo number 2",
          "prop[2][bar]": "bar number 2",
          "prop[2][bazz]": "bazz number 2"
      };
      
      function evaluate(data) {
        var newData = {};
        _.each(data, function(value, key) {
          _.set(newData, key, value);
        });
        return definedItemsOnly(newData);
      }
      
      // Since the resulting value of the given data set above
      // doesn't have prop[0] then this function below 
      // will provide you the means of removing any potential
      // undefined values in an array or possibly undefined 
      // key values in an object.
      function definedItemsOnly(item) {
        var isDefined = _.negate(_.isUndefined);
        if(_.isArray(item)) {
          return _.filter(item, isDefined);
        } else if(_.isObject(item)) {
          return _(item).pick(isDefined).mapValues(definedItemsOnly).value();
        }
        return item;
      }
      
      console.log(evaluate(data));
      

      如果您希望_.each 回调以更组合的形式出现,您可以像这样更改evaluate() 函数:

      function evaluate(data) {
        var newData = {};
        _.each(data, _.rearg(_.partial(_.set, newData), [1, 0]));
        return definedItemsOnly(newData);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-24
        • 2020-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        相关资源
        最近更新 更多