2016-07-28 91 views
0

目前我有三个阵列。 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对象数组是循环中,appNames数组中匹配heroku_application名称为名。一旦发现检查阶段类型示例:生产,分期,开发

将应用程序名称推送到正确的数组。 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); 
     } 
     } 
    }); 
    }); 
}); 
+0

什么是你的问题给出的代码? –

+0

我想我的问题是“如何循环多个数组并推入其他数组”,对于措辞不佳的问题,抱歉。我试图通过展示最终目标应该是什么样子来表达我的意思? – user3180997

+0

有人会说,这不是一个代码市场,请显示你的尝试。 –

回答

1

你不需要显式循环在所有到acomplish本 - 利用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);

+0

Array.reduce不是循环机制吗? – Rajesh

+0

@Rajesh当然是。 (我说*显式*循环!) – Jamiec

+0

我收到一条错误消息:Uncaught TypeError:无法读取属性'推'未定义的行: p [c.stage +'AppName']。push(c.heroku_application) ;每当我把p从行中运行,但没有输入任何东西 – user3180997

0

此功能将做什么最你想,虽然这是由你来制定出添加正确的值到数组(这是很容易,只要做你的逻辑在那里我已经给出了评语)

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

你并不需要嵌套循环。

  • 对于每一个项目在production
    • 找到该项目的heroku_applicationappNames的索引。我们将使用它来查找该号码。
    • 打开项目的stage,将项目的名称添加到(stage)ArrayAppName,并将项目的交叉引用编号添加到(stage)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

的你已经尝试代码有一些problems.The条件检查你使用,如果(一=== b.heroku_application)本身是wrong.Try低于

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); 
      });   
+0

这将返回一个空数组,不幸的是:( – user3180997

+0

不,我已经试过了。我将使用完整的代码 –

+0

@ user3180997进行编辑答案已经更新,并附上完整的代码。请再试一次 –