我想知道是否有一种简单的方法可以在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内创建所需的层次结构。但是想知道是否有更好的方法呢?
答案 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()
转换为普通功能并相应地调整代码。