获取一个未包含在数组中的对象元素

时间:2015-04-17 13:20:37

标签: javascript arrays object

我想返回一个对象的一个元素,它不包含在数组中

我有以下数组:

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
    }
}

这样可行 - 但是我不知道在//返回徽章位置返回哪个元素,因为我只知道没有找到任何元素。

有什么建议吗?

更新:

期望的输出:

{AAA: "AAA"}

2 个答案:

答案 0 :(得分: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;
}

虽然我建议你重新考虑一下你的数据结构。我不知道它们应该代表什么,但它们对于手头的任务来说似乎过于复杂。例如。数组可以只是[&#34; ABC&#34;,&#34; BCA&#34;],您可以使用Array#indexOf来搜索徽章。

答案 1 :(得分:1)

我会采取更多的功能&#34;方法,所以如果需要,我可以在以后轻松更改过程。

例如

'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);