首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS:按嵌套数组中的值对数组进行分组

JS:按嵌套数组中的值对数组进行分组
EN

Stack Overflow用户
提问于 2017-07-07 16:11:24
回答 3查看 146关注 0票数 1

我有一个数组:

代码语言:javascript
复制
[
  {
    theme: "low battery",
    Number: "S-10",
    components: [ "hardware", "battery" ]
  },
  {
    theme: "bad sync",
    Number: "S-11",
    components: [ "software" ]
  },
  {
    theme: "misc troubles",
    Number: "S-12",
    components: [ "hardware", "software" ]
  }
]

所以我想按"components“值对这个数组进行分组。换句话说,我想知道component在数组中出现了多少次。例如:

代码语言:javascript
复制
[
  {
    component: "hardware",
    amount: 2
  },
  {
    component: "software",
    amount: 2
  },
  {    
    component: "battery",
    amount: 1
  }
]
EN

回答 3

Stack Overflow用户

发布于 2017-07-07 16:23:30

您可以创建一个映射,以高效的方式存储每个组件的计数(查找复杂度为O(1)):

代码语言:javascript
复制
var items = [
  {
    theme: "low battery",
    Number: "S-10",
    components: [ "hardware", "battery" ]
  },
  {
    theme: "bad sync",
    Number: "S-11",
    components: [ "software" ]
  },
  {
    theme: "misc troubles",
    Number: "S-12",
    components: [ "hardware", "software" ]
  }
];

var componentMap = new Map();

items.forEach((item) => {
  item.components.forEach((component) => {
    if (componentMap.has(component)) {
      componentMap.set(component, componentMap.get(component) + 1);
    }
    else {
      componentMap.set(component, 1);
    }
  });
});

var componentCount = [];

componentMap.forEach((value, key) => {
  componentCount.push({
    component: key,
    amount: value
  });
});

console.log(componentCount);

票数 1
EN

Stack Overflow用户

发布于 2017-07-07 16:29:11

代码语言:javascript
复制
 var arr = [
      {
        theme: "low battery",
        Number: "S-10",
        components: [ "hardware", "battery" ]
      },
      {
        theme: "bad sync",
        Number: "S-11",
        components: [ "software" ]
      },
      {
        theme: "misc troubles",
        Number: "S-12",
        components: [ "hardware", "software" ]
      }
    ];
    var components = {};
    arr.forEach(function(val){
        val.components.forEach(function(c){
           components[c] = !(c in components) ? 1 : Number(components[c])+1;
        });
    });

    var componentCount = [];
    for(key in components){
     componentCount.push({'component' : key, 'amount' : components[key]});
    }
    
   console.log(componentCount);

票数 1
EN

Stack Overflow用户

发布于 2017-07-07 17:47:07

您可以使用forEach()循环和thisArg参数来存储每个组件和增量。

代码语言:javascript
复制
var data = [{"theme":"low battery","Number":"S-10","components":["hardware","battery"]},{"theme":"bad sync","Number":"S-11","components":["software"]},{"theme":"misc troubles","Number":"S-12","components":["hardware","software"]}]

var result = []

data.forEach(function(e) {
  var that = this;
  e.components.forEach(function(c) {
    if(!that[c]) {
      that[c] = {component: c, amount: 0}
      result.push(that[c])
    }
    that[c].amount += 1
  })
}, {})

console.log(result)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44965764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档