【问题标题】:Convert array into shorter array将数组转换为更短的数组
【发布时间】:2023-02-03 14:40:15
【问题描述】:

我有数组对象 -

[
 { 
  department:"Reviewer",
  name:"John"
 },
 { 
  department:"Reviewer",
  name:"Carol"
 },
 { 
  department:"Reviewer",
  name:"June"
 },
 { 
  department:"Assistant Reviewer",
  name:"Mac"
 },
 { 
  department:"Assistant Reviewer",
  name:"Issac"
 }
]

我想将此对象转换为数组对象,如下所示 -

[
     { 
      department:"Reviewer",
      name:"John;Carol;June;"
     },
     { 
      department:"Assistant Reviewer",
      name:"Mac;Issac;"
     },
]

我尝试使用过滤器 -

[... new Set(obj.department)].map((item)=>{return {item.name+";"} });

但是这个操作每一项只处理一个元素。它不积累名字。

【问题讨论】:

标签: javascript


【解决方案1】:

该代码将一个对象数组转换为一个新的对象数组,其中每个对象代表一个唯一的部门,每个对象的名称属性是一个以分号分隔的属于该部门的名称字符串。

const result = [...new Set(obj.map(item => item.department))].map(department => {
  const names = obj
    .filter(item => item.department === department)
    .map(item => item.name)
    .join(";");

  return { department, name: names + ";" };
});
  1. [...new Set(obj.map(item => item.department))] - 此行通过首先映射 obj 数组中每个对象的 department 属性,然后将生成的数组转换为 Set 以消除重复项来创建唯一部门名称数组。展开运算符 (...) 用于将集合转换回数组。

  2. .map(department => {...}) - 此行将映射函数应用于唯一部门名称数组。地图函数采用回调函数,回调函数采用部门参数。

  3. const names = obj.filter(item => item.department === department).map(item => item.name).join(";") - 此行创建属于特定部门的名称字符串,首先过滤 obj 数组以获取部门属性等于当前部门的所有对象,然后映射这些对象的名称属性,最后加入它们带分号 (;)。

  4. return { department, name: names + ";" } - 此行返回具有部门和名称属性的对象。 department 属性等于当前正在处理的部门,name 属性等于在步骤 3 中创建的名称字符串,最后添加分号 (;)。

    演示

    var obj = [{
        department: "Reviewer",
        name: "John"
      },
      {
        department: "Reviewer",
        name: "Carol"
      },
      {
        department: "Reviewer",
        name: "June"
      },
      {
        department: "Assistant Reviewer",
        name: "Mac"
      },
      {
        department: "Assistant Reviewer",
        name: "Issac"
      }
    ];
    
    const result = [...new Set(obj.map(item => item.department))].map(department => {
      const names = obj
        .filter(item => item.department === department)
        .map(item => item.name)
        .join(";");
    
      return { department, name: names + ";" };
    });
    
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

  • 重复项与 OP 要求的完全相同。他们不需要添加数字,而是添加字符串。
  • 此外,这遍历数组太多次:(映射 -> 转换为集合 -> 传播以转换为数组 -> 再次映射)X(嵌套过滤器 -> 映射 -> 连接)。
【解决方案2】:

您可以使用 reduce 来达到预期的效果:

const array = [
  { 
    department:"Reviewer",
    name:"John"
  },
  { 
    department:"Reviewer",
    name:"Carol"
  },
  { 
    department:"Reviewer",
    name:"June"
  },
  { 
    department:"Assistant Reviewer",
    name:"Mac"
  },
  { 
    department:"Assistant Reviewer",
    name:"Issac"
  }
];

const result = array.reduce((acc, cur) => {
  const foundIndex = acc.findIndex(department => department.department === cur.department);
  if (foundIndex === -1) {
    acc.push({ department: cur.department, name: cur.name + ';' });
  } else {
    acc[foundIndex].name += cur.name + ';';
  }
  return acc;
}, []);

console.log(result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 2018-05-27
    • 2012-06-04
    • 2012-01-26
    • 2013-06-10
    • 2013-11-04
    • 1970-01-01
    • 2014-07-31
    相关资源
    最近更新 更多