如何在JavaScript中更改对象键值对的位置



我看到过类似的问题,但使用不同的语言,我正在努力创建一个等效的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(,它将获取该键值对并将其移动到所需位置。

您想要的可以通过使用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

最新更新