1

I want to check if a value doesn't exist in the given object, by filtering an array of string.

I want to check if the values in the keys array are contained in the JSON object I'm looping. If one of the values isn't, I have to do something else, but only if the non-existent value (in resArray) is contained in the keys array.

JSON here

Here's what I tried:

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

Solved:

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

        }
      }

Thanks to everyone has replied to this thread.

9
  • 1
    Look up hasOwnProperty() Commented Aug 30, 2016 at 23:12
  • 1
    can be achieved using a combination of array methods like filter and/or includes and/or indexOf - other stuff depends on the contents of resArray - which you haven't really explained or given an example of Commented Aug 30, 2016 at 23:16
  • @JaromandaX if you look at the json link I left in the page, you can find what you are searching for. Commented Aug 30, 2016 at 23:17
  • yes, if I could read, that would be a good thing :p (sorry) Commented Aug 30, 2016 at 23:20
  • new RegExp("(\\b("+keys.join(")(")+")\\b)").test(resArray[j].name)... avoid outer loop. make rx before looping for best speed... Commented Aug 30, 2016 at 23:29

2 Answers 2

1

Your example insinuates that you're creating a new array based off the stats and conditional presence of your provided keys. An easy way to build this array would be to use Array.prototype.map to enumerate over your stats array. Next, in each iteration's callback you can pass the name property as an argument to keys.indexOf to check if that particular name is present in your keys array.

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

This will yield a new array which will contain either the stat object or a not regarding its absence in keys. However, you can return whatever your heart desires, as long as it's a valid array item.

Here's a working example with a small chunk of your dataset (but will work with your original dataset):

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

Sign up to request clarification or add additional context in comments.

3 Comments

You have access to the stat within the callback so just return stat.name;
But what if the value is missing in the "stats" array and given in the "keys" array?
That would mean that the current stat isn't whitelisted. You can return a note regarding it being missing from your keys. I've updated the example.
0

You can achieve what you want by using a combination of array functions. For example:

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

Then you can just loop through the matches/negatives to do what you want with them.

Fiddle here.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.