Получите 2 разных массива ключей и значений top 4 в соответствии с верхними значениями из JSON с использованием javascript

#javascript #arrays #json

#javascript #массивы #json

Вопрос:

Допустим, у меня есть объект JSON.

 var JSONObj = "skills":[
            {
                "skill": "HTML",
                "rate": "4"
            },
            {
                "skill": "JS",
                "rate": "5"
            },
            {
                "skill": "jQuery",
                "rate": "8"
            },
            {
                "skill": "Angular 2",
                "rate": "1"
            },
            {
                "skill": "XML",
                "rate": "3"
            },
            {
                "skill": "CSS",
                "rate": "10"
            }
        ]
  

Я хочу сгенерировать 2 разных массива для TopRates и TopSkills на основе их скорости в Javascript.
например,
var TopSkills = ["CSS", "jQuery", "JS", "HTML"];
var TopRates = [10, 8, 5, 4]

Ответ №1:

Вы можете использовать reduce() для возврата массивов навыков и ставок, а затем slice() для возврата top 4.

 var JSONObj = {
  "skills": [{
    "skill": "HTML",
    "rate": "4"
  }, {
    "skill": "JS",
    "rate": "5"
  }, {
    "skill": "jQuery",
    "rate": "8"
  }, {
    "skill": "Angular 2",
    "rate": "1"
  }, {
    "skill": "XML",
    "rate": "3"
  }, {
    "skill": "CSS",
    "rate": "10"
  }]
}

var r = JSONObj.skills.sort((a, b) => b.rate - a.rate).reduce(function(r, e) {
  r.skills = (r.skills || []).concat(e.skill);
  r.rates = (r.rates || []).concat(e.rate);
  return r;
}, {})

var TopSkills = r.skills.slice(0, 4);
var TopRates = r.rates.slice(0, 4);
console.log(TopSkills)
console.log(TopRates)  

Комментарии:

1. Превосходно @Nenad! 🙂

Ответ №2:

Сначала вы можете отсортировать массив по скорости, а затем сопоставить с умением и скоростью:

 var sortedBySkill = JSONObj.skills.sort(function(a, b) {
    return b.rate - a.rate;
});

console.log(sortedBySkill.map(function(a) {
    return a.skill;
}).slice(0,4));

console.log(sortedBySkill.map(function(a) {
    return a.rate;
}).slice(0,4));
  

Вот скрипка. Надеюсь, это поможет.

Ответ №3:

или даже легко с помощью forEach

 var topSkills = [];
var topRates = [];
JSONObj.skills.sort((a, b) => b.rate - a.rate).forEach(item => {
  topSkills.push(item.skill);
  topRates.push(item.rate);
});
  

Ответ №4:

 var JSONObj = [{"skill":"HTML","rate":"4"},{"skill":"JS","rate":"5"},{"skill":"jQuery","rate":"8"},{"skill":"Angular 2","rate":"1"},{"skill":"XML","rate":"3"},{"skill":"CSS","rate":"10"}]

JSONObj.sort(function(a,b){return  parseFloat(a.rate) - parseFloat(b.rate)});
JSONObj.reverse();

var TopSkills=[];
var TopRates=[];

for(var i=0;i<JSONObj.length;i  ){
  TopRates.push(JSONObj[i].rate);
  TopSkills.push(JSONObj[i].skill);
}
  

Проверьте демонстрацию