在javascript中按路径将值推送到数组中

时间:2016-09-16 11:02:38

标签: javascript arrays path

我想知道是否有一种简单的方法可以在JavaScript中完成以下操作

我已有的代码:

var formattedObject = {
    "id": "1"
};
var mapping = {
    "name": "name",
    "project": "projects.0.name"
};
$.each(mapping, function(path, fieldName) {
    fieldValue = $('form input[name="' + fieldName + '"]').val();
    /*
        Here I need to push a field value into array by path
    */
});

我想要的格式化对象如下:

var formattedObject = {
    "id": "1",
    "name": "Object name", //comes from input field
    "projects": [{
        "name": "My project name" //comes from input field
    }]
};

问题是:是否有一种简单的方法可以通过路径在formattedObject中设置值?

我的计划是通过"。"分割路径,循环遍历它并在formattedObject内创建所需的层次结构。但是想知道是否有更好的方法呢?

2 个答案:

答案 0 :(得分:3)

您可以拆分路径并检查是否存在以下元素。如果没有检查以下元素的数字并分配一个数组,否则为新属性的对象。然后返回属性的值。

最后指定值。



function setValue(object, path, value) {
    var fullPath = path.split('.'),
        way = fullPath.slice(),
        last = way.pop();

    way.reduce(function (r, a, i, aa) {
        function isNumber(v) {
            return String(+v) === v;
        }
        return r[a] = r[a] || isNumber(fullPath[i + 1]) ? [] : {};
    }, object)[last] = value;
}

var formattedObject = {
        id: "1"
    },
    mapping = {
        name: "name",
        project: "projects.0.name"
    };

setValue(formattedObject, mapping.name, 'xyz');
setValue(formattedObject, mapping.project, 42);

console.log(formattedObject);




答案 1 :(得分:1)

通过利用Object.prototype.setNestedValue(),您可以动态设置深层嵌套对象的任何值。您所需要的只是在参数中以正确的顺序提供属性名称和数组索引。最后一个参数是要设置的值。

让我们看看......

Object.prototype.setNestedValue = function(...a) {
  a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1))
                                                                       : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]),
                                                                         this[a[0]].setNestedValue(...a.slice(1)))
               : this[a[0]] = a[1];
  return this;
};

var formattedObject = {
    "id": "1",
    "name": "Object name", //comes from input field
    "projects": [{
        "name": "My project name" //comes from input field
    }]
};

console.log(JSON.stringify(formattedObject.setNestedValue("name","New Name"),null,4));
console.log(JSON.stringify(formattedObject.setNestedValue("projects",0,"name","New Project Name"),null,4));

您当然可以选择将Object.prototype.setNestedValue()转换为普通功能并相应地调整代码。