【问题标题】:More Complex Than Necessary: Comparing and Counting Items in Arrays比必要更复杂:比较和计算数组中的项目
【发布时间】:2016-05-24 17:05:05
【问题描述】:

我有一组代表类别的数组。每个数组是一个类别,数组中的每一项都是一个主题,例如

4 Categories containing Subjects
['A','B','D']
['C']
['E','F']
['G','H','I','J']

我有另一组数组。这些项目中的每一个都有最多四个可能的主题,例如

3 Items containing Subjects
['A','F']
['E','I','C']
['E','F','G']

我想计算每个类别的项目数。在这种情况下,结果应该是:

Total Items: 3
Category 1: 1
Category 2: 1
Category 3: 3
Category 4: 2

3 项,其中一些属于多个类别。我的一些项目在一个类别中有两个主题,这就是我搞砸的地方。我的结果是:

Total Items: 3
Category 1: 1
Category 2: 1
Category 3: 4
Category 4: 2

我对第 3 类的计数减少了 1,因为我的第三个项目有两个属于同一类别的科目,E 和 F。

我的尝试

作为参考,categories 是一个对象数组:

categories = [
  { name: string, subjects: string[], count: number }
]

项目有些相似:

items = [
  { subjects: Subject[] }
]

而主题只是:

{ id: string, name: string }

这是我需要调整的:

categories.map(category => 
  category.subjects.map(categorySubject => {
    if(items.subjects.map(itemSubject => itemSubject.id)
      .some(val => itemSubject.indexOf(val) === 0)) {
        category.count++;
    }
  }));

我认为我的方向是正确的,但我需要找到一种方法来检查项目主题是否在类别中,同时对于一个类别中有多个主题的项目不计算两次。我知道问题出在我的方法上。我无法更改项目的格式(是的,ID 确实是字符串),但如果有更好的方法,我可以更改类别。

【问题讨论】:

    标签: arrays object typescript count compare


    【解决方案1】:

    要回答您的问题,这似乎可行:

    var categories: Array<{ name: string, subjects: Subject[], count: number }> = [];
    
    type Subject = { id: string, name: string }
    
    var items: Array<{ subjects: Subject[] }> = [];
    
    function inItem(subject: Subject, item: { subjects: Subject[] }): boolean {
        return item.subjects.some(itemSubject => itemSubject.id === subject.id);
    }
    
    categories.forEach((category, index) => {
        let count = 0;
    
        for (let j = 0; j < items.length; j++) {
            for (let i = 0; i < category.subjects.length; i++) {
                if (inItem(category.subjects[i], items[j])) {
                    count++;
                    break;
                }
            }
        }
    
        console.log(`Category ${ index + 1 }: ${ count }`);
    });
    

    (code with the data in playground)

    但这并不是一个很好的解决方案,因为如果您不是编写代码的人,或者从现在起 2 个月后的您,这将不太容易理解。
    您可能应该想出一个更好的解决方案,例如索引它。

    只要有一个CategoriesIndex,它包含所有类别/主题,您可以通过它添加/删除/更改它们。在其中,您可以拥有相同的数组,但也可以拥有从项目到类别的引用。

    【讨论】:

      【解决方案2】:

      这是我想出来的,但是当他们看到这个时,没有人能够立即理解发生了什么。

      categories.map(category => category.count = 0);
      let nextCategory = false;
      let itemSubjects = items.map(item => item.subjects)
        .map(subjects => subjects.map(subject => subject.id));
      for(var i = 0; i < items.length; i++){
        for(var j = 0; j < categories.length; j++){
          nextCategory = false;
          for(var k = 0; k < categories[j].subjects.length; k++){
            for(var l = 0; l < itemSubjects[i].length; l++){
              if(itemSubjects[i][l] === categories[j].subjects[k]){
                categories[j].count++;
                nextCategory = true;
                break;
              }
            }
            if(nextCategory === true){
              break;
            }
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-02
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 2014-04-09
        • 2017-08-22
        • 1970-01-01
        相关资源
        最近更新 更多