当前位置: 首页 > 面试题库 >

JavaScript使用对象对数组项进行分组

微生恩
2023-03-14
问题内容

我的数组是这样的:

myArray = [
  {group: "one", color: "red"},
  {group: "two", color: "blue"},
  {group: "one", color: "green"},
  {group: "one", color: "black"}
]

我想将其转换为:

myArray = [
  {group: "one", color: ["red", "green", "black"]}
  {group: "two", color: ["blue"]}
]

因此,基本上,分组依据group

我尝试着:

for (i in myArray){
  var group = myArray[i].group;
  //myArray.push(group, {???})
}

我只是不知道如何处理相似组值的分组。


问题答案:

首先,在JavaScript中,使用遍历数组通常不是一个好主意for ... in

因此,您可以尝试执行以下操作:

var groups = {};
for (var i = 0; i < myArray.length; i++) {
  var groupName = myArray[i].group;
  if (!groups[groupName]) {
    groups[groupName] = [];
  }
  groups[groupName].push(myArray[i].color);
}
myArray = [];
for (var groupName in groups) {
  myArray.push({group: groupName, color: groups[groupName]});
}

groups这里使用中间对象有助于加快处理速度,因为它可以避免嵌套循环搜索数组。另外,因为groups使用迭代遍历对象(而不是数组)for ... in是合适的。

附录

FWIW,如果要避免在结果数组中出现重复的颜色条目,可以if在该行上方添加一条语句groups[groupName].push(myArray[i].color);以防止重复。使用jQuery看起来像这样;

if (!$.inArray(myArray[i].color, groups[groupName])) {
  groups[groupName].push(myArray[i].color);
}

如果没有jQuery,您可能想添加一个功能与jQuery相同的函数inArray

Array.prototype.contains = function(value) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] === value)
      return true;
  }
  return false;
}

然后像这样使用它:

if (!groups[groupName].contains(myArray[i].color)) {
  groups[groupName].push(myArray[i].color);
}

请注意,无论哪种情况,由于所有额外的迭代,您都将放慢速度,因此,如果您不需要避免结果数组中出现重复的颜色条目,我建议您避免使用此额外的代码。那里



 类似资料:
  • 我的数组是这样的: 我想把这个转换成: 所以,基本上,按分组。 我正在尝试: 我只是不知道如何处理相似组值的分组。

  • 问题内容: 我有一个对象数组: 如何获得按属性名称升序排列的数组? 我尝试这样做:,但这不起作用。 请帮我! 编辑:数组可以包含两个以上的对象!它可以包含数百个。 编辑: 为什么在“重复的”问题问了两年之前,这个问题为什么被标记为重复? 问题答案:

  • 有人知道一种方法(如果可能的话也可以使用lodash)通过对象键对对象数组进行分组,然后根据分组创建新的对象数组吗?例如,我有一个汽车对象数组: 我想制作一个由分组的新汽车对象数组:

  • 我有一个关于KML中的组的问题。 我有一个数据集,由50个对象组成。这些对象具有属性,即F.E严重性。有没有可能根据这些严重性类对我的KML文档进行分类?(1/1.5/2)还是基于任何其他属性?我已经手动创建了文件夹,但数据集越大,工作量就越大...我也想为对象着色,基于分类。附上我将添加我的文档。也许有人知道如何处理这件事?

  • 问题内容: 有谁知道(如果可能的话,也用破折号)通过对象键对对象数组进行分组然后根据分组创建新的对象数组的方法吗?例如,我有一系列汽车对象: 我想制作一组新的汽车对象,并按以下类别分组: 问题答案: 。简单,并允许在分组结构中的对象中进行一些重复。 但是,OP还要求删除重复的密钥。如果您想一路走下去: 产量: 如果您想使用Underscore.js进行此操作,请注意,其版本称为。

  • 我正在做一个项目,我正在与返回JSON响应的第三方服务集成。我正在使用Jackson将响应反序列化为JavaPOJO。响应是一个对象,它有几个Jackson能够轻松解析的简单字段。但是响应还包含一个带有单个条目的数组,该条目也是一个对象。当Jackson尝试反序列化它时,我得到了包含列表中单个条目的顶级对象,但是列表中单个条目的所有字段都是空的。知道我在这里做错了什么吗? 更新:将FAIL\u O