2015-04-17 63 views
0

我想返回一個對象的一個元素包含的物體的一個元素,即不包含在數組中獲取,是不是在陣列

我有例如下面的數組:

var aArray = [{ABC: { BADGE: "ABC" }}, {BCA: { BADGE: "BCA"}}] 

與下列對象:

var oObject = { 
    A: { 
     ABC: "ABC", 
     BCA: "BCA" 
    }, 
    B: { 
     BCA: "BCA", 
     AAA: "AAA" 
    } 
} 

所以我期望是獲得AAA

目前我是用下面的代碼掙扎:

for(var j = 0; j < aArray.length; j++) { 
    bNotFound = true; 

    for(var biz in oObject) { 
     for(var badge in oObject[biz]) { 
      if(badge == aArray[j].BADGE) { 
       bNotFound == false; 
      } 
     } 
    } 

    if(bNotFound) { 
     // Return Badge 
    } 
} 

這樣的工作 - 但是我不知道在//返回徽章位置要返回的元素,因爲我只知道,沒有任何元素被找到。

有什麼建議嗎?

UPDATE:

所需的輸出:

{AAA: "AAA"} 
+0

的第一個聲明 - 將 「aArray」 申報 - 是錯誤的。 「{}」不平衡。 – Pointy

+0

您希望返回哪個元素?第一個沒有找到的徽章? – doldt

+0

我想badgethat沒有找到@Pointy sry - 我改變了變量,並縮短它們,使它更具可讀性 - 我會修復它 –

回答

1

對不起,誤解了你的問題。您需要反轉循環:首先在對象上循環,然後在數組上循環。然後,如果在陣列中找不到徽章,則可以返回徽章。

function findBadge() { 
    for(var biz in oObject) { 
     for(var badge in oObject[biz]) { 
      var found = false; 
      for(var j = 0; j < aArray.length; j++) { 
       if(badge == aArray[j].BADGE) { 
        // found it in the array 
        found = true; 
        break; 
       } 
      } 
      if (!found) { 
       return badge; 
      } 
     } 
    } 

    // no badge was found that is not in the array 
    return null; 
} 

雖然我會建議你重新考慮你的數據結構。我不知道他們應該代表什麼,但他們對於手頭的任務似乎過於複雜。例如。該陣列可能只是[「ABC」,「BCA」],您可以使用Array#indexOf來搜索徽章。

+0

謝謝 - 這是工作! –

1

我會採取更「功能性」的方法,以便在稍後根據需要輕鬆更改過程。

例如

'use strict'; 

var aArray = [{ABC: { BADGE: "ABC" }}, {BCA: { BADGE: "BCA"}}]; 
var oObject = { 
    A: { 
     ABC: "ABC", 
     BCA: "BCA" 
    }, 
    B: { 
     BCA: "BCA", 
     AAA: "AAA" 
    } 
}; 
var results = []; 

// first make a function that checks if the value given is in the array's values 
var isValueInArray = (function(){ 

    var flatArray = []; 
    aArray 
    .map(function(obj){ 

    return Object.keys(obj) 
    .map(function(key){ 
     return obj[key].BADGE; 
    }); 
    }) 
    .forEach(function(ar){ 
    flatArray = flatArray.concat(ar); 
    }); 

    return function(value){ 
    return flatArray.indexOf(value) !== -1; 
    }; 
})(); 


// then push the values by whether they exist in the flat array 

Object.keys(oObject) 
.forEach(function(key){ 

    var thisObj = oObject[key]; 

    Object.keys(thisObj) 
    .forEach(function(key){ 

    if(!isValueInArray(thisObj[key])){ 
     var obj = {}; 
     obj[key] = thisObj[key]; 
     results.push(obj); 
    } 
    }); 
}); 

// results has the ... results 
console.log(results); 
+0

我也試過這個 - 它工作得很好,並且在附加它還返回不在數組中的所有元素 - thx! –

+0

看起來很醜,可能你可以優化它。但小功能通常是最好的決定。將從長遠來幫助你。 – AntouanK