太多时如何将值从一个数组分配给其他数组?

时间:2019-05-04 21:44:13

标签: javascript arrays

我显然不知道如何在标题中说明自己。.
我有一个包含来自调查的信息的数组,该数组为我提供了人们说他们使用更多以及如何评估它们的应用程序。
从可以选择以下应用程序的列表中:

  • Word
  • Excel
  • Power Point
  • 访问
  • Power Bi

您必须从以下几个方面对每个应用程序进行评分:

  • 可用性
  • 性能
  • 移动能力
  • 数据移动

这些功能可以评估为“ 1-差”,“ 2-平均”,“ 3-好”或“ 4-N / A”。

每个人也按其大陆划分:美国,亚洲,欧洲,非洲,大洋洲。

我的问题:
我需要将人们按他们的大陆分开。 以及他们如何评估每个应用程序:

美国的人在“可用性”中被评为“差”
来自美国的人在“表演”中被评为“差” 单词
美国的人在“移动功能”中被评为“差” 单词
来自美国的人在“数据移动”中被评为“不良” 单词

我需要为每次评估执行此精确循环:差,中,好和不适用。
而且对于每个应用程序:Word,Excel,Power Point,Access,Power Bi。
还有大陆:美国,亚洲,欧洲,非洲,大洋洲。

这是我的数组的外观(仅是一个人的示例):

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>

使用这种方法,一切都变成了噩梦。这是很多代码,因为我需要为每个洲制作一个数组,并为每个方面制作一个数组,以对每个应用程序进行评分!
我的实际代码要更长一些,需要更多方面的评分和更多应用。所以我的代码太长了。

我在这里的问题是:是否有更好,更轻松的方法来实现这一目标?
谢谢!

2 个答案:

答案 0 :(得分:1)

为使事情变得简单,您可以随时创建数组:

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

(请注意,您可能不应该使用for-in-loops,但是...是的)

答案 1 :(得分:0)

您可以改用javascript过滤器。喜欢

ex:
   filteredListwith1 = results.filter((item) => { 
         if(item.continent === 'America' && item['Word Usability'] === '1') {
              return item;
          });
    americaBox_Usability1 = filteredListwith1.length;

同样的内容,您也可以重复2和3。