在javascript中按路径将值推入数组

在javascript中按路径将值推入数组,javascript,arrays,path,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="' + fieldNam

我想知道是否有一种简单的方法可以用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内创建所需的层次结构。但是想知道是否有更好的方法来执行此操作?

您可以分割路径并检查是否存在以下元素。如果不是,请检查以下元素的编号,并为数组指定一个对象,否则为新属性指定一个对象。然后返回属性的值

在末尾指定值

函数设置值(对象、路径、值){
var fullPath=path.split('.'),
way=fullPath.slice(),
last=way.pop();
减少(函数(r,a,i,aa){
函数isNumber(v){
返回字符串(+v)==v;
}
返回r[a]=r[a]| | isNumber(完整路径[i+1])?[]:{};
},object)[last]=值;
}
var formattedObject={
id:“1”
},
映射={
姓名:“姓名”,
项目:“projects.0.name”
};
setValue(formattedObject,mapping.name,'xyz');
setValue(formattedObject,mapping.project,42);

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

让我们看看

Object.prototype.setNestedValue=函数(…a){
a、 长度>2?此[a[0]]的类型==“对象”&此[a[0]!==null?此[a[0]]。setNestedValue(…a.slice(1))
:(此[a[0]]=a[1]==“字符串”?{}:新数组(a[1]),的类型,
此[a[0]].setNestedValue(…a.slice(1)))
:此[a[0]]=a[1];
归还这个;
};
var formattedObject={
“id”:“1”,
“名称”:“对象名称”,//来自输入字段
“项目”:[{
“名称”:“我的项目名称”//来自输入字段
}]
};
log(JSON.stringify(formattedObject.setNestedValue(“name”,“New name”),null,4));

log(JSON.stringify(formattedObject.setNestedValue(“projects”,0,“name”,“newproject name”),null,4))顺便说一句,它不需要有那种类型的路径“projects.0.name”(带点)。它也可以是一些其他的符号,如果这使它更容易。。。