2015-04-17 51 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