将数组动态映射到嵌套对象
Map dynamically array to nested object
我想在提交时检索表单内容并将该数据映射到一个对象中。
let userData = $(e.currentTarget).serializeArray();
let userDataObject = this.serializedToObject(userData);
--
要通过 POST
发送的模板对象
serializedToObject(serializedArray) {
let templateObject = {
privider: '',
pop3: {
host: '',
port: 110,
ssl: false
},
imap: {
host: '',
port: 993
},
email: '',
password: ''
};
for (let data in serializedArray) {
}
return templateObject;
}
--
userData的形式是
[Object, Object, Object, Object, Object, Object, Object]
-- 而对象的形式是
Object: {
name: 'provider',
value: 'Aladin'
}
Object: {
name: 'imap-host',
value: '955'
}
Object: {
name: 'imap-port',
value:
}
Object: {
email: 'test@gmail.com',
value:
}
所以我需要一些帮助来将该对象数组映射到 templateObject。
非常感谢任何帮助。
更新
[{"name":"name","value":"Nicholas Barbaros"},{"name":"email","value":"george@google.com"},{"name":"password","value":"nicu121-mujik"},{"name":"imap","value":"imap.server.com"},{"name":"imap-port","value":"ad"},{"name":"pop3-host","value":"pop.server.com"},{"name":"pop3-port","value":"465"}, {"name":"pop3-ssl","value":"false"}]
每个serializedArray
对象的名称-属性都有一个负号(-
)表示嵌套对象,你可以按这些字符拆分,然后设置值您 templateObject
的属性:
var serializedArray = [{"name":"name","value":"Nicholas Barbaros"},{"name":"email","value":"george@google.com"},{"name":"password","value":"nicu121-mujik"},{"name":"imap","value":"imap.server.com"},{"name":"imap-port","value":"ad"},{"name":"pop3-host","value":"pop.server.com"},{"name":"pop3-port","value":"465"}, {"name":"pop3-ssl","value":"false"}];
// your defaults
var templateObject = {
provider: '',
pop3: {
host: '',
port: 110,
ssl: false
},
imap: {
host: '',
port: 993
},
email: '',
password: '',
};
serializedArray.forEach(function(obj) {
var deep = obj.name.split('-');
var key = deep.pop();
var level = templateObject;
deep.forEach(function(inner) {
var nested = level[inner];
var isObject = Object(nested) === nested;
level = isObject ? nested : {};
});
level[key] = obj.value;
});
// return templateObject; // when inside your function
console.log(templateObject);
您还可以使用 reduce 方法,以更实用的方式
const array = [{
name: 'provider',
value: 'Aladin'
},{
name: 'imap-host',
value: '955'
},{
name: 'imap-port',
value: 'something'
}];
const newObject = array.reduce( (acc, item, {}) => {
acc[item.name] = item.value;
return acc;
})
console.log(newObject);
Link 到 fiddle:https://jsfiddle.net/y5xkddnn/
迭代序列化数组并将其映射到嵌套对象的开销太大。
请考虑这种方法,它不太复杂:
let userData = new FormData($(e.currentTarget)[0]);
let userDataObject = serializedToObject(userData);
function serializedToObject(data) {
return {
provider: data.get('provider'),
pop3: {
host: data.get('pop3-host'),
port: data.get('pop3-port'),
ssl: data.get('pop3-ssl')
},
imap: {
host: data.get('imap-host'),
port: data.get('imap-port')
},
email: data.get('email'),
password: data.get('password')
};
}
我猜到了这里的一些字段。如有需要请更正。
我想在提交时检索表单内容并将该数据映射到一个对象中。
let userData = $(e.currentTarget).serializeArray();
let userDataObject = this.serializedToObject(userData);
-- 要通过 POST
发送的模板对象serializedToObject(serializedArray) {
let templateObject = {
privider: '',
pop3: {
host: '',
port: 110,
ssl: false
},
imap: {
host: '',
port: 993
},
email: '',
password: ''
};
for (let data in serializedArray) {
}
return templateObject;
}
-- userData的形式是
[Object, Object, Object, Object, Object, Object, Object]
-- 而对象的形式是
Object: {
name: 'provider',
value: 'Aladin'
}
Object: {
name: 'imap-host',
value: '955'
}
Object: {
name: 'imap-port',
value:
}
Object: {
email: 'test@gmail.com',
value:
}
所以我需要一些帮助来将该对象数组映射到 templateObject。 非常感谢任何帮助。
更新
[{"name":"name","value":"Nicholas Barbaros"},{"name":"email","value":"george@google.com"},{"name":"password","value":"nicu121-mujik"},{"name":"imap","value":"imap.server.com"},{"name":"imap-port","value":"ad"},{"name":"pop3-host","value":"pop.server.com"},{"name":"pop3-port","value":"465"}, {"name":"pop3-ssl","value":"false"}]
每个serializedArray
对象的名称-属性都有一个负号(-
)表示嵌套对象,你可以按这些字符拆分,然后设置值您 templateObject
的属性:
var serializedArray = [{"name":"name","value":"Nicholas Barbaros"},{"name":"email","value":"george@google.com"},{"name":"password","value":"nicu121-mujik"},{"name":"imap","value":"imap.server.com"},{"name":"imap-port","value":"ad"},{"name":"pop3-host","value":"pop.server.com"},{"name":"pop3-port","value":"465"}, {"name":"pop3-ssl","value":"false"}];
// your defaults
var templateObject = {
provider: '',
pop3: {
host: '',
port: 110,
ssl: false
},
imap: {
host: '',
port: 993
},
email: '',
password: '',
};
serializedArray.forEach(function(obj) {
var deep = obj.name.split('-');
var key = deep.pop();
var level = templateObject;
deep.forEach(function(inner) {
var nested = level[inner];
var isObject = Object(nested) === nested;
level = isObject ? nested : {};
});
level[key] = obj.value;
});
// return templateObject; // when inside your function
console.log(templateObject);
您还可以使用 reduce 方法,以更实用的方式
const array = [{
name: 'provider',
value: 'Aladin'
},{
name: 'imap-host',
value: '955'
},{
name: 'imap-port',
value: 'something'
}];
const newObject = array.reduce( (acc, item, {}) => {
acc[item.name] = item.value;
return acc;
})
console.log(newObject);
Link 到 fiddle:https://jsfiddle.net/y5xkddnn/
迭代序列化数组并将其映射到嵌套对象的开销太大。
请考虑这种方法,它不太复杂:
let userData = new FormData($(e.currentTarget)[0]);
let userDataObject = serializedToObject(userData);
function serializedToObject(data) {
return {
provider: data.get('provider'),
pop3: {
host: data.get('pop3-host'),
port: data.get('pop3-port'),
ssl: data.get('pop3-ssl')
},
imap: {
host: data.get('imap-host'),
port: data.get('imap-port')
},
email: data.get('email'),
password: data.get('password')
};
}
我猜到了这里的一些字段。如有需要请更正。