How to transform Array to Object?

和自甴很熟 提交于 2019-12-14 04:15:19

问题


What is the best way to transform an array like this:

const arr = [
  { name: 'Bob' },
  { name: 'Ben' }
  { name: 'Cole' }
  { name: 'Mary' }
  { name: 'Travis' }
]

to an object like:

const obj = {
  'B': ['Bob', 'Ben'],
  'C': ['Cole'],
  'M': ['Mary'],
  'T': ['Travis']
}

Using only vanilla JS


回答1:


I created an array where the key is the first letter of the name using the reduce function and restructuring the 'name' from the objects. If the key exists in the array the name is pushed (using spread operator). Else, it creates the key with only one element.

const arr = [
  { name: 'Bob' },
  { name: 'Ben' },
  { name: 'Cole' },
  { name: 'Mary' },
  { name: 'Travis' }
];

const obj = arr.reduce((res, {name})=>{
  res[name[0]] = res[name[0]] ? [...res[name[0]],name] : [name];
  return res;
}, {});

console.log(obj);



回答2:


You can use array#reduce. Iterate through each object of your array and then extract out the first letter and add names corresponding to it.

const arr = [{name: 'Bob'}, {name: 'Ben'}, {name: 'Cole'}, {name: 'Mary'}, {name: 'Travis'}],
      result = arr.reduce((r,{name}) => {
        r[name[0]] = r[name[0]] || [];
        r[name[0]].push(name);
        return r;
      },{});
console.log(result);



回答3:


Vanilla JS you say? Here you go

let nil      = x => x === undefined;
let empty    = ([h]) => nil(h);
let first    = ([h]) => h;
let last     = ([h, ...t]) => empty(t) ? h : last(t);
let map      = ([h, ...t], f) => nil(h) ? [] : [f(h), ...map(t, f)];
let reduce   = ([h, ...t], f, i) => nil(h) ? i : reduce(t, f, f(i, h));
let tab      = (a, f) => map(a, x => [x, f(x)]);
let push     = (a, x) => nil(a) ? [x] : [...a, x];
let groupBy  = (a, f) => _groupBy(tab(a, f));
let _groupBy = ka => reduce(ka, (g, [x, k]) => ({...g, [k]: push(g[k], x)}), {});

///

const arr = [{ name: 'Bob' },{ name: 'Ben' },{ name: 'Cole' },{ name: 'Mary' },{ name: 'Travis' }]
z = groupBy(map(arr, x => x.name), first)
console.log(z)

No built-ins!




回答4:


I think this thread is missing a non functional answer, so here it is:

const obj = {};

for(const {name} of arr)
  (obj[name[0]] || (obj[name[0]] = [])).push({name});



回答5:


let obj = {};
arr.forEach( e => {
  const name = e.name;
  if (!obj[name.charAt(0)]) obj[name.charAt(0)] = [];
  obj[name.charAt(0)].push(name);
})

I'm generating a new object and adding to it news keys based in the first char of the name values (only if the key hasn't been already added). Then, I add each value to the key that corresponds.



来源:https://stackoverflow.com/questions/48828392/how-to-transform-array-to-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!