0

I have a JSON data, that I want to automatically find every occurrence of a specific name.

{
  "servergenre": "Classic Rock",
  "servergenre2": "pop",
  "servergenre3": "rock",
  "servergenre4": "jazz",
  "servergenre5": "80s",
  "serverurl": "http://www.name.com",
  "servertitle": "ServerHero",
  "bitrate": "48",
  "samplerate": "0"
}

in here servergenre is repeated a few times with increment (2,3,4,5 and ...) as I do not know ho many servergenre there will be in the JSON, I need a method to loop through it and find as many times as there are instances of servergenre and add the result in an array possibly.

Something like this following code:

var URL = "http://name.com/file.json"
$.getJSON(URL, function(data) {
  var i = 1;
  $.each(data.servergenre + i, function(index, value) {
        /// CODE
  });
});

Obviously the code above does not work but that was my initial idea.

So any better idea to make it work and save all exisiting instances of servergenre in an array?

Thank is advance.

DannyBoy
  • 434
  • 5
  • 21

4 Answers4

4

Test each key of your JSON to see if it matches "servergenre". If it does, push the corresponding value to an array.

let json = {
  "servergenre": "Classic Rock",
  "servergenre2": "pop",
  "servergenre3": "rock",
  "servergenre4": "jazz",
  "servergenre5": "80s",
  "serverurl": "http://www.name.com",
  "servertitle": "ServerHero",
  "bitrate": "48",
  "samplerate": "0"
}

let result = []

Object.keys(json).forEach( key => {
  if(/servergenre/.test(key)) result.push(json[key])
})

console.log(result) // ["Classic Rock","pop", "rock","jazz","80s"]

Alternative method (inspired by osynligsebastian's answer) with filter and map :

   let json = {
      "servergenre": "Classic Rock",
      "servergenre2": "pop",
      "servergenre3": "rock",
      "servergenre4": "jazz",
      "servergenre5": "80s",
      "serverurl": "http://www.name.com",
      "servertitle": "ServerHero",
      "bitrate": "48",
      "samplerate": "0"
    }

    let result = Object.keys(json)
                    .filter( key => /servergenre/.test(key))
                    .map( key => json[key] )

    console.log(result) // ["Classic Rock","pop", "rock","jazz","80s"]
Jeremy Thille
  • 26,047
  • 12
  • 43
  • 63
  • Thanks for the answers. I will approve it. However, even though the code is working, in WebStorm editor is it picked as syntax error. I thought maybe you would know why. e.g. `error: expression expected for =>` or `error: , expected for .test(key)){` – DannyBoy May 09 '17 at 15:24
  • Then you did something wrong. Click on "Run code snippets" above, both snippets work. – Jeremy Thille May 09 '17 at 20:42
  • Could you please have a look at the following [question](https://stackoverflow.com/questions/44597729/how-to-get-read-of-editors-error-for-object-key) as it is based on your answer on this post. Thanks – DannyBoy Jun 16 '17 at 20:56
  • Sure did, and posted my answer. – Jeremy Thille Jun 16 '17 at 21:16
2

Filter all keys containing the word "servergenre". See this fiddle

var data = {
  "servergenre": "Classic Rock",
  "servergenre2": "pop",
  "servergenre3": "rock",
  "servergenre4": "jazz",
  "servergenre5": "80s",
  "serverurl": "http://www.name.com",
  "servertitle": "ServerHero",
  "bitrate": "48",
  "samplerate": "0"
}

let keys = Object.keys(data).filter(key => key.indexOf('servergenre') > -1);

console.log(keys);

keys.forEach(key => {
  console.log(`${key}: ${data[key]}`);
});
George
  • 6,630
  • 2
  • 29
  • 36
2

Steps :

  1. get the array of the properties using Object.keys() method.
  2. Use Array.filter() method on Object.keys() to filter out the elements from an array having same occurance(substring).
  3. Use string.includes() method to check if a string includes "servergenre".
  4. Use Array.length to get the counts of the element.

DEMO

var jsonObj = {
  "servergenre": "Classic Rock",
  "servergenre2": "pop",
  "servergenre3": "rock",
  "servergenre4": "jazz",
  "servergenre5": "80s",
  "serverurl": "http://www.name.com",
  "servertitle": "ServerHero",
  "bitrate": "48",
  "samplerate": "0"
};

var res = Object.keys(jsonObj).filter(item => { return item.includes("servergenre"); });

console.log(res.length);

Updated Answer as per the Jeremy Thille comment.In below demo, we are using indexOf () instead of includes().

var jsonObj = {
  "servergenre": "Classic Rock",
  "servergenre2": "pop",
  "servergenre3": "rock",
  "servergenre4": "jazz",
  "servergenre5": "80s",
  "serverurl": "http://www.name.com",
  "servertitle": "ServerHero",
  "bitrate": "48",
  "samplerate": "0"
};

var res = Object.keys(jsonObj).filter(item => { return item.indexOf("servergenre") != -1 });

console.log(res.length);
Community
  • 1
  • 1
Debug Diva
  • 26,058
  • 13
  • 70
  • 123
  • If this code is to be run in a browser, you'll have trouble with `string.includes`. Its support is still very poor. http://stackoverflow.com/questions/31340868/includes-not-working-in-all-browsers – Jeremy Thille May 09 '17 at 20:46
  • @JeremyThille Thanks for correcting me. I updated my answer please check now. – Debug Diva May 10 '17 at 03:42
1
   var URL = "http://name.com/file.json"
    $.getJSON(URL, function(data) {
      for(var n in data)
      {
        if(n.substr(0,11)=="servergenre") alert(n);
      }
    });