比必要的更复杂:比较和计数数组中的项目



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

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

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

我尝试了什么

作为参考,类别是一组对象:

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实际上是字符串),但如果有更好的方法,我可以更改类别。

要回答您的问题,这似乎很有效:

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 }`);
});

(代码和操场上的数据)

但这并不是一个很好的解决方案,因为如果你不是代码的编写者,或者两个月后你就不容易理解了
你可能应该想出一个更好的解决方案,例如索引它。

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

这就是我想到的,但当人们看到这一点时,他们将无法立即理解发生了什么。

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;
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新