【问题标题】:Get all object pairs into one Array (Javascript)将所有对象对放入一个数组(Javascript)
【发布时间】:2021-02-24 17:08:44
【问题描述】:

我有一个这样的数组:

const arr = [{name: "some", category: "Cat1"}, {name: "else", category: "Cat2"}, {name: "stuff", category: "Cat2"}]

我想创建一个只有类别而没有像这样的对的新数组:

const newArr =[Cat1, Cat2]

然后将其映射到我的 JSX 元素中。我尝试了很多东西,但没有任何效果 感谢您的帮助。

【问题讨论】:

    标签: javascript arrays reactjs object jsx


    【解决方案1】:

    试试这个

    const arr = [
      {name: "some", category: "Cat1"}, 
      {name: "else", category: "Cat2"}, 
      {name: "stuff", category: "Cat2"}
    ]
    
    const result = arr.map(a=> a.category);
    console.log([...new Set(result)]);

    【讨论】:

    • 太完美了!
    【解决方案2】:

    你正在寻找这样的东西:

    const arr = [{name: "some", category: "Cat1"}, {name: "else", category: "Cat2"}, {name: "stuff", category: "Cat2"}];
    
    console.log([...new Set(arr.map(x => x.category))]);

    【讨论】:

      【解决方案3】:

      使用set object 方法是最好的方法。正如这里已经提到的,我将展示其他方法。

      使用对象:

      您可以使用Array.prototype.forEach() 方法和Nullish coalescing operator (??) 来完成您的工作。

      const arr = [
        { name: 'some', category: 'Cat1' },
        { name: 'else', category: 'Cat2' },
        { name: 'stuff', category: 'Cat2' },
      ];
      const ret = {};
      arr.forEach((x) => {
        ret[x.category] = ret[x.category] ?? x.category;
      });
      console.log(Object.values(ret));

      使用地图对象:

      Map 对象以原始插入顺序存储键值对。虽然 object 与 map object 类似,但 map object 在需要做大量的增删改查时表现更好。

      const arr = [
        { name: 'some', category: 'Cat1' },
        { name: 'else', category: 'Cat2' },
        { name: 'stuff', category: 'Cat2' },
      ];
      const map = new Map();
      const ret = [];
      arr.forEach((x) => {
        if (!map.has(x.category)) {
          map.set(x.category, true);
          ret.push(x.category);
        }
      });
      console.log(ret);

      使用数组:

      Array.prototype.includes() 方法检查数组是否包含指定的元素,并据此返回真或假。

      const arr = [
        { name: 'some', category: 'Cat1' },
        { name: 'else', category: 'Cat2' },
        { name: 'stuff', category: 'Cat2' },
      ];
      const ret = [];
      arr.forEach((x) => {
        if (!ret.includes(x.category)) ret.push(x.category);
      });
      console.log(ret);

      使用归约法:

      Array.prototype.reduce() 方法为每次迭代运行给定的函数并将数组减少为单个值。

      const arr = [
        { name: 'some', category: 'Cat1' },
        { name: 'else', category: 'Cat2' },
        { name: 'stuff', category: 'Cat2' },
      ];
      
      const ret = Object.values(
        arr.reduce((prev, c) => {
          const p = prev;
          const key = c.category;
          if (!p[key]) p[key] = c.category;
          return p;
        }, {})
      );
      console.log(ret);

      【讨论】:

      • 您的答案和其他答案之间的最佳方式是什么?
      猜你喜欢
      • 2017-07-20
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      相关资源
      最近更新 更多