我们如何使用 reduce 和 rest 运算符将以下数组转换为对象

How can we convert below arrays into objects using reduce and rest operator

任何人都可以帮助我将以下数组转换为对象:

let data = [
  { name: "A", job: "soft", address: "ggn" },
  { name: "B", job: "software", address: "GGN" },
  { name: "C", job: "software", address: "GGN" },
];
Output:  {
“A”:{job: “software”, address: “GGN”},
“B”:{job: “software”, address: “GGN”},
“C”:{job: “software”, address: “GGN”}
};

这里我不需要对象的名称及其值。

我尝试使用以下解决方案:

const output = data.reduce((object, x) => {
    return { ...object, [x.name]: x };
}, {});

但是我得到了不同的答案。 有人可以通过提供最佳解决方案来提供帮助。我们可以使用 reduce 和 rest 运算符来解决它。

你可以这样使用它:

let data = [
    { name: "A", job: "soft", address: "ggn" },
    { name: "B", job: "software", address: "GGN" },
    { name: "C", job: "software", address: "GGN" },
];

const output = data.reduce((acc, curr) => {
    const { name, ...rest } = curr;
    acc[name] = rest
    return acc;
}, {});

或:

const output = data.reduce((acc, curr) => {
    const { name, ...rest } = curr;
    return { ...acc, [name]: rest };
}, {});

你可以这样做

let data = [{
    name: "A",
    job: "soft",
    address: "ggn"
  },
  {
    name: "B",
    job: "software",
    address: "GGN"
  },
  {
    name: "C",
    job: "software",
    address: "GGN"
  },
];


const output = data.reduce((object, x) => {
  const {
    name,
    job,
    address
  } = x;
  object[name] = {
    job,
    address
  }

  return object;
}, {});
console.log(output)

首先你需要改变双引号,它们不是标准的双引号 您可以使用 map 方法

以更短的代码编写它

let data = [
{name: "A", job: "soft", address: "ggn"},
{name: "B", job: "software", address: "GGN"},
{name: "C", job: "software", address: "GGN"},
];


const toto = data.map ( element => { 

const name = element.name 
delete element.name 
return {[name] : element}})

console.log(toto)

查看地图方法以了解更多信息:https://learnjsx.com/category/2/posts/es6-mapFunction

let data = [
    {name: 'A', job: 'soft', address: 'ggn'},
    {name: 'B', job: 'software', address: 'GGN'},
    {name: 'C', job: 'software', address: 'GGN'},
];

const output = {};

const obj = data.reduce((acc, el) => {
    const { name, job, address } = el;
    return { ...acc, [name]: { job, address} };
}, output);

console.log(obj);

您可以将 .map().reduce()Object.assign() 结合使用,如下所示:

let output = data.map(({name,...rest}) => ({[name]:rest}))
.reduce((acc,cur) => Object.assign(acc,cur),{});

演示版

let data = [
{name: "A", job: "soft", address: "ggn"},
{name: "B", job: "software", address: "GGN"},
{name: "C", job: "software", address: "GGN"},
];

let output = data.map(({name,...rest}) => ({[name]:rest}))
    .reduce((acc,cur) => Object.assign(acc,cur),{});

console.log( output );

或者,您可以使用 .map().reduce(),如下所示:

let output = data.map(({name,...rest}) => ({[name]:rest}))
.reduce((acc,cur) => ({...acc,...cur}),{});

演示版

let data = [
{name: "A", job: "soft", address: "ggn"},
{name: "B", job: "software", address: "GGN"},
{name: "C", job: "software", address: "GGN"},
];

let output = data.map(({name,...rest}) => ({[name]:rest}))
    .reduce((acc,cur) => ({...acc,...cur}),{});

console.log( output );

或者,如果您的对象没有太多属性:

let output = data.reduce((acc,cur) => ({...acc,...{[cur.name]: {job:cur.job,address:cur.address}}}),{});

演示版

let data = [
{name: "A", job: "soft", address: "ggn"},
{name: "B", job: "software", address: "GGN"},
{name: "C", job: "software", address: "GGN"},
];

let output = data.reduce((acc,cur) => ({...acc,...{[cur.name]: {job:cur.job,address:cur.address}}}),{});

console.log( output );

此处不需要reduce

Object.fromEntries() 来拯救 - 你可以使用 .map 和解构将对象映射到一对数组中,fromEntries 可以变成一个普通对象:

> let data = [
  { name: "A", job: "soft", address: "ggn" },
  { name: "B", job: "software", address: "GGN" },
  { name: "C", job: "software", address: "GGN" },
];

> Object.fromEntries(data.map(({name, ...rest}) => [name, rest]));
{
  A: {job: 'soft', address: 'ggn'}
  B: {job: 'software', address: 'GGN'},
  C: {job: 'software', address: 'GGN'}
}

最简单的方法是先解构对象,这样就可以把名字分开了。然后你可以用累加器 return 它们。

const data = [
  { name: "A",  job: "software",  address: "GGN"  },
  { name: "B",  job: "software",  address: "GGN"  },
  { name: "C",  job: "software",  address: "GGN"  },
];

const output = data.reduce((acc, item) => {
  const { name, ...rest } = item;
  return {
    ...acc,
    [name]: rest,
  }
}, {})

console.log(output)