我已经看到与此问题类似的问题,但是使用不同的语言,并且我正努力创建与JavaScript等效的问题。
我正在接收一个对象,并且想通过一个函数更改一个(或多个)属性的位置。例如,
使用
的原始对象{
individual: [
{
dob: '2017-01-01',
isAuthorized: true,
},
],
business: [
{
taxId: '123',
},
],
product: {
code: '123',
},
}
我想将isAuthorized
的位置更改为business
数组内的第一个对象,而不是individual
。
喜欢
{
individual: [
{
dob: '2017-01-01',
},
],
business: [
{
taxId: '123',
isAuthorized: true,
},
],
product: {
code: '123',
},
}
到目前为止,我一直在尝试创建一个包含键名和位置的对象,以将其更改为例如
{
isAuthorized: obj.business[0]
}
然后循环遍历原始对象以及具有位置值的对象,然后设置该键值对的位置。
基本上,在此函数中,我想查看一下,如果原始对象包含某个值(在这种情况下为isAuthorized
),它将采用该键值对并将其移至所需位置。
答案 0 :(得分:0)
您可以通过使用loadsh轻松实现所需的内容,这是一个如何根据定义的结构图进行重组的工作片段。扩展了此示例以匹配您想要的内容。
该示例正在进行深度克隆,如果可以很好地修改原始对象,请跳过该步骤以避免开销。
// input data
const data = {
individual: [
{
dob: '2017-01-01',
isAuthorized: true,
},
],
business: [
{
taxId: '123',
},
],
product: {
code: '123',
},
};
// the structure change map
const keyMap = {
'individual[0].isAuthorized': 'business[0].isAuthorized'
};
function parseData(data,keyMap) {
const newData = _.cloneDeep(data);
for( let [source,dest] of Object.entries(keyMap) ) {
_.set(newData,dest,_.get(newData,source));
_.unset(newData,source);
}
return newData;
}
console.log(parseData(data, keyMap));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
注意:loadsh的集合将任何数字值视为数组索引,因此,如果您使用数字对象键,请使用loadash.setWith。我建议阅读doc中的示例以更好地理解。 https://lodash.com/docs/4.17.15#set