如何将Array转换为Object?

时间:2018-02-16 13:58:07

标签: javascript arrays object ecmascript-6 reduce

像这样转换数组的最佳方法是什么:

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

到像这样的对象:

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

仅使用vanilla JS

5 个答案:

答案 0 :(得分:3)

你说香草JS吗?你去吧

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)

没有内置插件!

答案 1 :(得分:2)

您可以使用array#reduce。遍历数组中的每个对象,然后提取出第一个字母并添加与其对应的名称。

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);

答案 2 :(得分:1)

我创建了一个数组,其中键是使用reduce函数的名字的第一个字母,并从对象重构'name'。如果密钥存在于数组中,则推送名称(使用扩展运算符)。否则,它只用一个元素创建密钥。

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);

答案 3 :(得分:0)

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

我正在生成一个新对象,并根据名称值的第一个字符添加新闻密钥(仅当尚未添加密钥时)。 然后,我将每个值添加到对应的键。

答案 4 :(得分:0)

我认为这个帖子缺少一个非功能性的答案,所以这里是:

const obj = {};

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