如何将单个对象数组项拆分为三个对象的数组?

问题描述 投票:0回答:2

给出的是响应数据的以下数据结构...

const res = {
  data: [{
    name: 'c2',
    ipaddr: '192.168.1.5',
    port: 4435,
    sshuser: "abc",
    sshpass: "xyz",
    sshport: 22,
    license: 'license.txt',
  }],
};

我想将其转换为

const newState = [{
  name: 'c2',
  ipaddr: '192.168.1.5',
  port: 4435,
}, {
  sshuser: "abc",
  sshpass: "xyz",
  sshport: 22,
}, {
  license: 'license.txt',
}]

下面发布的代码确实达到了预期的结果...

var obj1 = {
  name: res.data[0].name,
  ipaddr: res.data[0].ipaddr,
  port: res.data[0].port,
};
var obj2 = {
  sshuser: res.data[0].sshuser,
  sshpass: res.data[0].sshpass,
  sshport: res.data[0].sshport,
};
var obj3 = {
  license: res.data[0].license,
};
const newState = [obj1, obj2, obj3];

还有哪些其他方法可以实现相同的结果(也许使用更短的语法)?

javascript arrays object data-structures destructuring
2个回答
0
投票

OP示例代码的结果的实现方式没有任何问题。

围绕对象解构构建的解决方案可能看起来类似于下面的代码......

const {
  name, ipaddr, port,
  sshuser, sshpass, sshport,
  license,
} = res.data[0];

const newState = [
  { name, ipaddr, port },
  { sshuser, sshpass, sshport },
  { license },
];
console.log('newState ...', newState);
.as-console-wrapper { min-height: 100%!important; top: 0; }
<script>
  const res = {
    data: [{
      name: 'c2',
      ipaddr: '192.168.1.5',
      port: 4435,
      sshuser: "abc",
      sshpass: "xyz",
      sshport: 22,
      license: 'license.txt',
    }],
  };
</script>


0
投票

虽然您的代码工作正常并且是实现此目的的有效方法(尽管我建议使用

const
而不是
var
),但我建议可能执行映射(如果您有多个映射,这可能很有用)原始数组中的对象,也许你可以考虑使用
.map()
而不是
.flatMap()
):

const res = {data: [ {name: 'c2', ipaddr: '192.168.1.5', port: 4435, sshuser: "abc", sshpass: "xyz", sshport: 22, license: 'license.txt'}]};

const newState = res.data.flatMap(({name, ipaddr, port, sshuser, sshpass, sshport, license}) => [
  {name, ipaddr, port}, {sshuser, sshpass, sshport}, {license}
]);

console.log(newState);

或者,您可以从数组中解构对象,并使用简写属性名称创建对象数组:

const res = {data: [ {name: 'c2', ipaddr: '192.168.1.5', port: 4435, sshuser: "abc", sshpass: "xyz", sshport: 22, license: 'license.txt'}]};

const [{name, ipaddr, port, sshuser, sshpass, sshport, license}] = res.data;
const newState = [{name, ipaddr, port}, {sshuser, sshpass, sshport}, {license}];
console.log(newState);

© www.soinside.com 2019 - 2024. All rights reserved.