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

时间:2020-02-17 21:49:41

标签: javascript object ecmascript-6

我已经看到与此问题类似的问题,但是使用不同的语言,并且我正努力创建与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),它将采用该键值对并将其移至所需位置。

1 个答案:

答案 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