我想返回一个对象的一个元素,它不包含在数组中
我有以下数组:
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"}
答案 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);