【问题标题】:How to transform Array to Object?如何将数组转换为对象?
【发布时间】:2018-07-27 11:00:07
【问题描述】:

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

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

到一个像这样的对象:

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

仅使用原生 JS

【问题讨论】:

  • 你标记了 queston [reduce],所以你应该已经知道...
  • @FedericoklezCulloca 不幸的是,我不完全了解如何使用 reduce 来实现它。我只知道如果我需要将数组转换为对象,javascript中有一个方法

标签: javascript arrays object ecmascript-6 reduce


【解决方案1】:

您可以使用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】:

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

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

    【讨论】:

    • 仅代码的答案并不理想,您介意添加说明吗?
    • 我创建了一个数组,其中键是名称的第一个字母,使用 reduce 函数并从对象中解构“名称”。如果键存在于数组中,则推送名称(使用扩展运算符)。否则,它只创建一个元素的键。
    【解决方案3】:
    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】:

      你说香草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)

      没有内置插件!

      【讨论】:

      • 你是想杀了这个可怜的家伙吗?这有点太棒了!
      • 只是想知道为什么 map 和 reduce 方法不被视为 Vanilla JS?
      • @nutboltu:既然 OP 要求提供一个普通的解决方案,他们显然更感兴趣的是事情是如何工作的,而不是完成工作。
      • @georg 我不确定我的意思是不是你上面所说的。我很感兴趣如何在不使用库的情况下解决我的问题 :)
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-02-13
        • 2022-01-23
        • 2011-01-29
        • 2018-12-12
        • 1970-01-01
        相关资源
        最近更新 更多