如何在javascript中将对象键点符号转换为对象树

Jer*_*606 1 javascript jquery lodash

我有一个表单,我想将它发送到一个 ajax 端点,为此我有这个辅助方法:

    $.fn.serializeFormToObject = function() {
      //serialize to array
      var data = $(this).serializeArray();
      //add also disabled items
      $(':disabled[name]', this)
        .each(function() {
            data.push({ name: this.name, value: $(this).val() });
        });

      //map to object
      var obj = {};
      data.map(function(x) { obj[x.name] = x.value; });
      return obj;
    };
Run Code Online (Sandbox Code Playgroud)

问题是我的表单的某些名称中有点符号(使用 MVC 强类型模型)所以我有这个对象作为结果:

Task.Addresses.Box:""
Task.Addresses.City:"Limal"
Task.Addresses.Country:"Belgique"
Task.Deadline:"1/10/2017 12:18:18 PM"
Task.TaskSourceId:"1"
Run Code Online (Sandbox Code Playgroud)

预期的结果是:

{ Task : { Addresses: { Box: "", City: "Limal", Country: "Belgique"}, Deadline: "1/10/2017 12:18:18 PM", TaskSourceId:"1" } }
Run Code Online (Sandbox Code Playgroud)

我使用 lodash 库,但几个小时后我找不到实现此预期结果的方法。

有人可以为我提供一个有效的 javascript 帮助程序来提供预期的嵌套对象吗?

编辑:对于重复的问题,另一个问题不询问组合嵌套对象在一起

在@ori-drori 的回答之后,此代码按预期工作:

$.fn.serializeFormToObject = function() {
    //serialize to array
    var data = $(this).serializeArray();
    //add also disabled items
    $(':disabled[name]', this)
        .each(function() {
            data.push({ name: this.name, value: $(this).val() });
        });

    //map to object
    var obj = {};
    data.map(function (x) { obj[x.name] = x.value; });

    var objNested = {};
    _.forEach(obj, function (value, key) { _.set(objNested, key, value) });
    return objNested;
};
Run Code Online (Sandbox Code Playgroud)

Ori*_*ori 5

使用 迭代数据Array#forEach,并使用将值分配给路径(名称)_.set()

data.forEach(function(x) { _.set(obj, x.name, x.value) });
Run Code Online (Sandbox Code Playgroud)

我没有你的原始数据,所以这里有一个使用你提供的键值的演示。

data.forEach(function(x) { _.set(obj, x.name, x.value) });
Run Code Online (Sandbox Code Playgroud)
var fields = {
  "Task.Addresses.Box": "",
  "Task.Addresses.City": "Limal",
  "Task.Addresses.Country": "Belgique",
  "Task.Deadline": "1/10/2017 12:18:18 PM",
  "Task.TaskSourceId": "1"
};

var obj = {};

_.forEach(fields, function(value, key) {
  _.set(obj, key, value);
});

console.log(obj);
Run Code Online (Sandbox Code Playgroud)