循环遍历多个数组 - 推入多个数组

时间:2016-07-28 07:27:04

标签: javascript arrays loops for-loop

目前我有三个阵列。 AppNames这是一个应用程序名称。 Number of AddOns这是每个应用程序正在使用的附加组件数。 (两个这些数组一起使用.E.G “cirr-contentful-demo”有1个添加)。

看下面:

var prodArrayAppName = [],
  stgArrayAppName = [],
  devArrayAppName = [],
  prodNoAddOns = [],
  stgNoAddOns = [],
  devNoAddOns = [];

var appNames = ["cirr-contentful-demo", "cirr-contentful-handler-backup", "cirr-test-app"];

var numberAddOne = [1, 5, 7]

var production = [{
    "id": "16",
    "heroku_application": "cirr-contentful-demo",
    "stage": "Production"
},
{
    "id": "4",
    "heroku_application": "cirr-contentful-handler-backup",
    "stage": "Staging"
},
{
    "id": "9",
    "heroku_application": "test-backup",
    "stage": "Development"
}];

我需要循环遍历production对象数组,将heroku_application名称与appNames 数组中的名称相匹配。找到后,检查阶段类型示例:生产,分期,开发

将应用程序名称推送到正确的数组。 E.G生产申请prodArrayAppName。然后获取应用程序具有的addOns数量并将其放入正确的NoOfAddons。 E.G prodArrayAppName。

意味着最终游戏应该如下:

prodArrayAppName = [cirr-contentful-demo]
prodNoAddOns = [1]

stgArrayAppName = [cirr-contentful-handler-backu]
stgNoAddOns = [5]

devArrayAppName = [test-backup]
devNoAddOns = [7]

这是我到目前为止尝试的代码,但到目前为止没有运气:

production.forEach(function(a) {
  appNames.forEach(function(b) {
    numberAddOne.forEach(function(c) {
      if (a === b.heroku_application) {
        if (b.stage === "Production") {
          prodArrayAppName.push(b.heroku_application);
          prodNoAddOns.push(c);
        } else if (b.stage === "Staging") {
          stgArrayAppName.push(b.heroku_application);
          stgNoAddOns.push(c);
        } else {
          devArrayAppName.push(b.heroku_application);
          devNoAddOns.push(c);
        }
      }
    });
  });
});

4 个答案:

答案 0 :(得分:1)

你真的不需要嵌套循环。

  • 对于production中的每个项目:
    • heroku_application中找到项目appNames的索引。我们将使用它来查找号码。
    • 启用项目stage,将项目的名称添加到(阶段)ArrayAppName,并将项目的交叉引用号码添加到(阶段)NoAddOns。
production.forEach(function(project) {
  var index = appNames.indexOf(project.heroku_application);
  if (index === -1) { return; }

  switch (project.stage) {
    case "Production":
      prodArrayAppName.push(project.heroku_application);
      prodNoAddOns.push(numberAddOne[index]);
      break;
    case "Staging":
      stgArrayAppName.push(project.heroku_application);
      stgNoAddOns.push(numberAddOne[index]);
      break;
    case "Development":
      devArrayAppName.push(project.heroku_application);
      devNoAddOns.push(numberAddOne[index]);
      break;
  }
});

答案 1 :(得分:1)

您根本不需要显式循环来完成此操作 - 使用reduce

var init = {
    DevelopmentAppName:[],
    DevelopmentNoAddOns:[],
    StagingAppName:[],
    StagingNoAddOns:[],
    ProductionAppName:[],
    ProductionNoAddOns:[],
};

var appNames = ["cirr-contentful-demo", "cirr-contentful-handler-backup", "cirr-test-app"];

var numberAddOne = [1,5,7]

var production = [
                    {
                    "id":"16",
                    "heroku_application":"cirr-contentful-demo",
                    "stage" : "Production"
                    },
                    {
                    "id":"4",
                    "heroku_application":"cirr-contentful-handler-backup",
                    "stage" : "Staging"
                    },
                    {
                    "id":"9",
                    "heroku_application":"test-backup",
                    "stage" : "Development"
                    }];
                    
var result = production.reduce(function(p,c){
     var idx = appNames.indexOf(c.heroku_application);
     p[c.stage + 'AppName'].push(c.heroku_application);
     p[c.stage + 'NoAddOns'].push(numberAddOne[idx] || 0);
     return p;
}, init);

console.log(result);

答案 2 :(得分:1)

您尝试过的代码存在一些问题。如果(a === b.heroku_application)本身错误,您使用的条件检查。请尝试下面给出的代码

var prodArrayAppName = [], stgArrayAppName = [], devArrayAppName = [], prodNoAddOns = [], 
stgNoAddOns = [], devNoAddOns = [];

var appNames = ["cirr-contentful-demo", "cirr-contentful-handler-backup", "cirr-test-app"];

var numberAddOne = [1,5,7];

var production = [
                {
                "id":"16",
                "heroku_application":"cirr-contentful-demo",
                "stage" : "Production"
                },
                {
                "id":"4",
                "heroku_application":"cirr-contentful-handler-backup",
                "stage" : "Staging"
                },
                {
                "id":"9",
                "heroku_application":"test-backup",
                "stage" : "Development"
                }];

                production.forEach(function(a) {                    
                         for(var i=0;i<appNames.length;i++)
                         {
                             if(a.heroku_application==appNames[i])
                             {
                                    if(a.stage==="Production")
                                    {
                                        prodArrayAppName.push(appNames[i]);
                                        prodNoAddOns.push(numberAddOne[i]);
                                    }
                                    else if(a.stage==="Staging")
                                    {
                                        stgArrayAppName.push(appNames[i]);
                                        stgNoAddOns.push(numberAddOne[i]);
                                    }
                                    else if(a.stage==="Development")
                                    { 
                                        devArrayAppName.push(appNames[i]);
                                        devNoAddOns.push(numberAddOne[i]);
                                    }

                             }
                         }                          


                });

            //checking code 
            prodArrayAppName.forEach(function(a) {
            alert(a);
            });         

答案 3 :(得分:0)

这个功能可以完成您想要的大部分功能,虽然您可以自行决定向阵列添加正确的值(这很简单,只需按照我的所有逻辑进行操作即可。 ; ve发表评论)

function getAppAddOnCount(heroku_application_name) {
    var apps = {};
    // This loop can be put elsewhere
    for (var i = 0, len = production.length; i < len; i++) {
        // Replace this line with logic adding objects to your array as desired
        apps[production[i].heroku_application] = i;
    }
    return {
        prodArrayAppName: heroku_application_name,
        prodNoAddOns: numberAddOne[apps[heroku_application_name]]
    };
}