我显然不知道如何在标题中解释自己。
我有一个包含来自调查的信息的数组,这个数组给了我人们说他们使用得更多的应用程序,以及它们是如何评估它们的。
从列表中可以选择以下应用程序:
您必须按以下方面对每个应用程序进行评级:
这些功能可分为“1-穷人”、“2-平均”、“3-好”或"4-N/A“。
另外,每个人都是按自己的大陆划分的:美洲、亚洲、欧洲、非洲、大洋洲。
我的问题:
我需要按大陆把人分开。通过他们对每个应用程序的评估:
来自美国的人们在“可用性”方面将单词评为“穷人”。
来自美国广播公司()的人在“表现”(Performance)中被评为“穷人”()。
来自美国广播公司()的人在“移动能力”(Mobile)中被评为“贫穷”()。
来自美国广播公司()的人在“数据运动”中被评为“贫穷”Word。
我需要对每个评估做一个精确的循环:差、平均、好和N/A。
也适用于每个应用程序: Word,Excel,Power,Access,Power。
还有欧洲大陆:美洲,亚洲,欧洲,非洲,大洋洲。
这就是我的数组的样子(只是一个人的例子):
var results = [
{
"Author": "Person 1",
"Word Usability": "3",
"Word Performance": "2",
"Word Mobile capability": "1",
"Word Data movement": "4",
"Excel Usability": "3",
"Excel Performance": "2",
"Excel Mobile capability": "1",
"Excel Data movement": "4",
"PowerPoint Usability": "3",
"PowerPoint Performance": "2",
"PowerPoint Mobile capability": "1",
"PowerPoint Data movement": "4",
"Access Usability": "3",
"Access Performance": "2",
"Access Mobile capability": "1",
"Access Data movement": "4",
"PowerBi Usability": "3",
"PowerBi Performance": "2",
"PowerBi Mobile capability": "1",
"PowerBi Data movement": "4",
"Continent": "America"
},
...
]我所做的是创建各种数组,然后将它们循环起来,按区域将人分开,并通过他们如何根据前面标记的每个方面来评估每个应用程序:
<script>
//I created arrays for each continent
var america = [],
europe = [],
asia = [],
africa = [],
oceania = [];
//And also separate the count of each "evaluation" from each aspect to rate the app
var americaWord_Usability1 = 0,
americaWord_Usability2 = 0,
americaWord_Usability3 = 0,
americaWord_Usability4 = 0;
var americaWord_Performance1 = 0,
americaWord_Performance2 = 0,
americaWord_Performance3 = 0,
americaWord_Performance4 = 0;
...
//I make the loop
for(var i=0;i<results.length;i++) {
var currentItem = results[i];
//depending their continent, I send each people to their correspondent array
if(currentItem.Continent == "America") {
america.push(currentItem);
}
...
}
//now I loop by region and send them depending their app and how they were evaluated in each aspect
for(var q=0;q<america.length;q++){
var currentItem = america[q];
if(currentItem["Word Usability"] == "1") {
americaWord_Usability1++;
} else if(currentItem["Word Usability"] == "2") {
americaWord_Usability2++;
} else if(currentItem["Word Usability"] == "3") {
americaWord_Usability3++;
} else {
americaWord_Usability4++;
}
if(currentItem["Word Performance"] == "1") {
americaWord_Performance1++;
} else if(currentItem["Word Performance"] == "2") {
americaWord_Performance2++;
} else if(currentItem["Word Performance"] == "3") {
americaWord_Performance3++;
} else {
americaWord_Performance4++;
}
...
}
</script>用这种方法,一切都变成了噩梦。这是大量的代码,因为我需要为每个大陆建立一个数组,并为每个应用程序的每个方面建立一个数组!
我的实际代码有点长,有更多的方面需要评分和更多的应用程序。所以我的代码变得非常长。
我在这里的问题是:是否有更好、更容易实现这一目标的方法?
提前感谢!
发布于 2019-05-04 22:04:58
为了简化工作,只需动态创建数组:
var userData = [];
for(var i=0;i<results.length;i++) {
var currentItem = results[i];
// If the subarray doesn't exist yet, create it
if (userData[currentItem.Continent] == null) userData[currentItem.Continent] = [];
// Push the data into the corresponding array
userData[currentItem.Continent].push(currentItem);
}现在,您将拥有一个数组,该数组将所有用户按大陆分隔开来。您可以应用相同的逻辑来检查您的评级,因此,例如:
// List all the possible keywords for ratings here
var ratingKeywords = ["Word Usability", "Excel Usability"];
// Empty arra for ratings
var ratings = [];
// Go through the continents
for (var continentName in userData) {
var continent = userData[continentName];
// Array for continent ratings
if (!ratings[continentName]) ratings[continentName] = [];
for (var u in continent) {
var user = continent[u];
for (var k in ratingKeywords) {
var keyword = ratingKeywords[k];
console.log(keyword);
var rating = user[keyword];
if (!ratings[continentName][keyword]) ratings[continentName][keyword] = [];
if (!ratings[continentName][keyword][rating.toString()]) ratings[continentName][keyword][rating.toString()] = 0;
ratings[continentName][keyword][rating.toString()]++;
}
}
}这看起来有点笨重,但您不需要对任何东西进行硬编码。如果一个新的大陆出现(这很可能不会发生,因为海平面上升,请去素食或尽快减少你的肉类消费),这个代码应该仍然有效。
您将得到一个具有以下结构的数组,例如:ratings["Europe"]["Word Usability"][5]: 400
(请注意,你也许不应该使用循环,但是.是的)
发布于 2019-05-04 22:01:43
您可以使用javascript过滤器代替。如下所示
ex:
filteredListwith1 = results.filter((item) => {
if(item.continent === 'America' && item['Word Usability'] === '1') {
return item;
});
americaBox_Usability1 = filteredListwith1.length;同样的事情,你也可以重复2和3。
https://stackoverflow.com/questions/55987037
复制相似问题