2016-08-30 163 views
1

我想通過過濾字符串數組來檢查給定對象中是否存在值。檢查JSON對象中是否存在值

我想檢查keys數組中的值是否包含在正在循環的JSON對象中。如果其中一個值不是,我必須做其他操作,但前提是keys數組中包含不存在的值(在resArray中)。

JSON here

這裏是我的嘗試:

var keys = [ 
    "total_kills", 
    "total_deaths", 
    "total_planted_bombs", 
    "total_defused_bombs", 
    "total_kills_knife", 
    "total_kills_headshot", 
    "total_wins_pistolround", 
    "total_wins_map_de_dust2", 
    "last_match_wins", 
    "total_shots_fired", 
    "total_shots_hit", 
    "total_rounds_played", 
    "total_kills_taser", 
    "last_match_kills", 
    "last_match_deaths", 
    "total_kills_hegrenade", 
    ]; 

    var resArray = stats.playerstats.stats; 
    var statsArray = []; 

    for (var i = 0; i < keys.length; i++) { 
    for(var j = 0; j < resArray.length; j++){ 

     //if the value in keys array exists, do something 
     if(resArray[j]["name"] === keys[i]){ 
     //do something 
     } 
     if(<value doesn't exist)>) 
     //do something else. 
    } 
    } 

解決:

function contains(obj, key, value) { 
     return obj.hasOwnProperty(key) && obj[key] === value; 
     } 

     var resArray = stats.playerstats.stats; 
     var statsArray = []; 

     for (var i = 0; i < keys.length; i++) { 

     resArray.some(function(found){ 

      if(contains(found, "name", keys[i])){ 

      statsArray.push(found); 

      } 

     }); 

     if(typeof statsArray[i] == 'undefined'){ 

      console.log("Not present in array: " + keys[i]); 
      statsArray.push({"name": keys[i], "value": 'None'}); 

     } 
     } 

感謝大家回覆了此線程。

+1

查看'hasOwnProperty()' – CollinD

+1

可以使用像'filter'和/或'includes'和/或'indexOf'這樣的數組方法來實現 - 其他的東西取決於'resArray'的內容 - 你還沒有真正解釋或給出 –

+0

@JaromandaX的例子,如果你看看我留在頁面中的json鏈接,你可以找到你正在尋找的東西。 –

回答

2

你的例子暗示你正在創建一個新的數組,基於你提供的鍵的統計和有條件的存在。構建這個數組的簡單方法是使用Array.prototype.map來枚舉你的stats數組。接下來,在每次迭代的回調中,您可以將name屬性作爲參數傳遞給keys.indexOf,以檢查keys陣列中是否存在該特定的name

var statsArray = stats.map(function(stat) { 
    if (keys.indexOf(stat.name) > -1) { 
    return stat; 
    } else { 
    return stat.name + ' not found.'; 
    } 
}); 

這將產生一個新的數組,其中將包含stat對象或不包含其在鍵中的缺失。不過,只要它是一個有效的數組項,就可以返回任何你想要的內容。

這裏是你的數據集的小塊工作示例(但將與您的原始數據集工作):

var keys = [ 
 
    "total_kills", 
 
    "total_deaths", 
 
    "total_planted_bombs", 
 
    "total_defused_bombs", 
 
    "total_kills_knife", 
 
    "total_kills_headshot", 
 
    "total_wins_pistolround", 
 
    "total_wins_map_de_dust2", 
 
    "last_match_wins", 
 
    "total_shots_fired", 
 
    "total_shots_hit", 
 
    "total_rounds_played", 
 
    "total_kills_taser", 
 
    "last_match_kills", 
 
    "last_match_deaths", 
 
    "total_kills_hegrenade", 
 
]; 
 

 
var stats = [{ 
 
    "name": "total_kills", 
 
    "value": 25305 
 
}, { 
 
    "name": "total_deaths", 
 
    "value": 27474 
 
}, { 
 
    "name": "total_time_played", 
 
    "value": 1822419 
 
}, { 
 
    "name": "total_planted_bombs", 
 
    "value": 1397 
 
}, { 
 
    "name": "total_defused_bombs", 
 
    "value": 239 
 
}, { 
 
    "name": "total_wins", 
 
    "value": 11477 
 
}, { 
 
    "name": "total_damage_done", 
 
    "value": 3783962 
 
}, { 
 
    "name": "total_money_earned", 
 
    "value": 65159500 
 
}, { 
 
    "name": "total_rescued_hostages", 
 
    "value": 1 
 
}, { 
 
    "name": "total_kills_knife", 
 
    "value": 278 
 
}, { 
 
    "name": "total_kills_hegrenade", 
 
    "value": 168 
 
}, { 
 
    "name": "total_kills_glock", 
 
    "value": 699 
 
}, { 
 
    "name": "total_kills_deagle", 
 
    "value": 1289 
 
}, { 
 
    "name": "total_kills_elite", 
 
    "value": 37 
 
}, { 
 
    "name": "total_kills_fiveseven", 
 
    "value": 165 
 
}, { 
 
    "name": "total_kills_xm1014", 
 
    "value": 78 
 
}, { 
 
    "name": "total_kills_mac10", 
 
    "value": 154 
 
}, { 
 
    "name": "total_kills_ump45", 
 
    "value": 330 
 
}, { 
 
    "name": "total_kills_p90", 
 
    "value": 1105 
 
}, { 
 
    "name": "total_kills_awp", 
 
    "value": 6934 
 
}, { 
 
    "name": "total_kills_ak47", 
 
    "value": 4528 
 
}, { 
 
    "name": "total_kills_aug", 
 
    "value": 137 
 
}, { 
 
    "name": "total_kills_famas", 
 
    "value": 540 
 
}, { 
 
    "name": "total_kills_g3sg1", 
 
    "value": 116 
 
}, { 
 
    "name": "total_kills_m249", 
 
    "value": 50 
 
}, { 
 
    "name": "total_kills_headshot", 
 
    "value": 7112 
 
}, { 
 
    "name": "total_kills_enemy_weapon", 
 
    "value": 2308 
 
}, { 
 
    "name": "total_wins_pistolround", 
 
    "value": 843 
 
}, { 
 
    "name": "total_wins_map_cs_assault", 
 
    "value": 9 
 
}, { 
 
    "name": "total_wins_map_cs_italy", 
 
    "value": 15 
 
}, { 
 
    "name": "total_wins_map_cs_office", 
 
    "value": 11 
 
}, { 
 
    "name": "total_wins_map_de_aztec", 
 
    "value": 71 
 
}, { 
 
    "name": "total_wins_map_de_cbble", 
 
    "value": 373 
 
}, { 
 
    "name": "total_wins_map_de_dust2", 
 
    "value": 4857 
 
}, { 
 
    "name": "total_wins_map_de_dust", 
 
    "value": 25 
 
}, { 
 
    "name": "total_wins_map_de_inferno", 
 
    "value": 777 
 
}, { 
 
    "name": "total_wins_map_de_nuke", 
 
    "value": 247 
 
}, { 
 
    "name": "total_wins_map_de_train", 
 
    "value": 47 
 
}, { 
 
    "name": "total_weapons_donated", 
 
    "value": 2466 
 
}, { 
 
    "name": "total_broken_windows", 
 
    "value": 30 
 
}, { 
 
    "name": "total_kills_enemy_blinded", 
 
    "value": 566 
 
}, { 
 
    "name": "total_kills_knife_fight", 
 
    "value": 67 
 
}, { 
 
    "name": "total_kills_against_zoomed_sniper", 
 
    "value": 2284 
 
}, { 
 
    "name": "total_dominations", 
 
    "value": 270 
 
}, { 
 
    "name": "total_domination_overkills", 
 
    "value": 225 
 
}, { 
 
    "name": "total_revenges", 
 
    "value": 207 
 
}, { 
 
    "name": "total_shots_hit", 
 
    "value": 83704 
 
}, { 
 
    "name": "total_shots_fired", 
 
    "value": 399207 
 
}, { 
 
    "name": "total_rounds_played", 
 
    "value": 23419 
 
}, { 
 
    "name": "total_shots_deagle", 
 
    "value": 12137 
 
}, { 
 
    "name": "total_shots_glock", 
 
    "value": 21299 
 
}, { 
 
    "name": "total_shots_elite", 
 
    "value": 777 
 
}, { 
 
    "name": "total_shots_fiveseven", 
 
    "value": 3385 
 
}, { 
 
    "name": "total_shots_awp", 
 
    "value": 22667 
 
}]; 
 

 
var statsArray = stats.map(function(stat) { 
 
    if(keys.indexOf(stat.name) > -1) { 
 
    return stat; 
 
    } else { 
 
    return stat.name + ' not present in keys'; 
 
    } 
 
}); 
 

 
console.log(statsArray);

+0

你可以在回調中訪問stat,所以只需要'return stat.name;' – Seth

+0

但是如果在「stats」數組中缺少值並在「keys」數組中給出該值,該怎麼辦? –

+0

這將意味着當前的統計信息未被列入白名單。您可以返回關於您的密鑰丟失的筆記。我更新了這個例子。 – Seth

0

你可以達到你想要的東西通過使用陣列組合功能。例如:

let stats = data.playerstats.stats; 
let matches = stats.filter(i => keys.indexOf(i.name) >= 0); 
let matchKeys = matches.map(k => k.name); 
let negatives = keys.filter(i => matchKeys.indexOf(i) < 0); 

然後,你可以通過比賽/底片循環做你想要與他們的東西。

小提琴here