2016-07-28 145 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進行編輯答案已經更新,並附上完整的代碼。請再試一次 –