Как я могу найти наибольшее значение определенного узла в многомерном объекте JSON с помощью JavaScript или jQuery

#javascript #jquery #json #sorting #object

#javascript #jquery #json #сортировка #объект

Вопрос:

Вот краткий пример объекта, с которым я работаю.

 {
    "myservices": [
        {
            "name": "oozie",
            "hostidn": "1",
            "details": "failed process health monitor....",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        },
        {
            "name": "oozie",
            "hostidn": "2",
            "details": "failed process health monitor....",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        },
        {
            "name": "oozie",
            "hostidn": "3",
            "details": "failed process health monitor....",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        },
        {
            "name": "oozie",
            "hostidn": "4",
            "details": "failed process health monitor....",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        },
        {
            "name": "oozie",
            "hostidn": "5",
            "details": "failed process health monitor....",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        },
        {
            "name": "single-namenode",
            "hostidn": "2",
            "details": "failed process health monitor....",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        }
    ]
}
  

В конечном итоге я хочу найти наивысший «hostidn», прежде чем запускать все это и отображать их. hostidn — это N-е число, оно может быть единственным числом или может составлять сотни с несколькими дубликатами между ними. Моя цель — найти это наивысшее значение и выполнить для него цикл for или while на основе этого, чтобы сгруппировать их вместе в визуальном отображении. Пример обратите внимание, что у меня есть один hostidn ниже с номером 2, в то время как у всех остальных есть собственный. Я бы хотел сгруппировать два с 2 вместе в поле для отображения, но в этом сценарии есть 5 разных hostidn. Я не знаю, может быть, я думаю об этом неправильно, однако я приму предложения.

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

1. вопрос в том, что вы хотите отобразить все те, у кого самый высокий hostidn, включая dupes?

2. Вы хотите получить наибольшее число или число, которое встречается чаще всего? В любом случае вам нужно выполнить итерацию по массиву и сравнить числа, так в чем же ваша реальная проблема?

3. Ну, в основном я хочу отобразить все, включая дубликаты, на основе hostidn. Hostidn в этом случае будет действовать как контейнер, который затем покажет каждому из них один и тот же hostidn в этом контейнере. Проблема здесь в том, что hostidn может быть любым от 1 до 200 , поэтому у меня нет установленного номера для работы. Другая проблема заключается в том, что способ вывода в объекте, по меньшей мере, случайный, поэтому мне нужно найти наибольшее число, чтобы я мог запускать цикл while like на основе от низкого до высокого, числа всегда будут в порядке, насколько мне известно, что означает отсутствие пробелов в подсчете. Я просто не знаю, что такое большое число

Ответ №1:

базовый алгоритм, которому вы можете следовать

объявите и установите переменную равной нулю, например

$currentHighest = 0;

затем выполните итерацию по массиву json и на каждой итерации сопоставляйте значение hostidn с $currentHighest , если значение выше, чем значение, уже существующее в $currentHighest наборе, это значение равно $currentHighest

 $currentHighest=0;
 $(data.myservices).each(function(index, element){
   if(data.myservices[index].hostidn>$currentHighest)
     $currentHighest=data.myservices[index].hostidn;
  });
//loop ends and `$currentHighest` will have the highest value
  

в конце итерации вы получите наибольшее значение в $currentHighest

Проверено и проверено

 $(function(){
 $.post("highest.json",function(data){
 $currentHighest=0;
  $(data.myservices).each(function(index, element){
   if(data.myservices[index].hostidn>$currentHighest)
     $currentHighest=data.myservices[index].hostidn;
  });
alert($currentHighest);
},'json');
});
  

Ответ №2:

Возвращает массив, содержащий один или несколько объектов с наивысшим idn. Также смотрите http://jsfiddle.net/Kai/DUTK7 / (запись в консоль)

 function getHighHostIdn (json) {
    var i = 0;
        hostidns = [],
        len = json.myservices.length,
        highest = null,
        matches = [];

    for (; i < len; i  ) {
        hostidns.push(parseInt(json.myservices[i].hostidn, 10));
    }

    highest = Math.max.apply(null, hostidns);

    for (i = 0, len = hostidns.length; i < len; i  ) {
        if (hostidns[i] === highest) {
            matches.push(json.myservices[i]);
        }
    }

    return matches;
}
  

Ответ №3:

Мне нравится использовать linq.js для такого рода вещей это позволяет вам избежать многих традиционных циклов for в вашем коде (явно). Конечно, вы, вероятно, можете написать более оптимизированный код для каждого варианта использования, но для большинства вещей производительность не так важна, а более чистый / короткий код является большим преимуществом.

Если есть только шанс для одного максимального значения, или если вам все равно, какое из них вы получите, если оно имеет максимальное значение, тогда сделайте что-то вроде этого:

 var result = Enumerable.From(obj.myservices).MaxBy('$.hostidn');
  

Или, если вы можете иметь и хотите несколько объектов max, сделайте это:

 var e = Enumerable.From(obj.myservices);
var result2 = e.Where('$.hostidn == '   e.Max('$.hostidn')).ToArray();
  

Вы можете увидеть код в действии здесь: http://jsfiddle.net/sTaHv/13 /
РЕДАКТИРОВАТЬ: я также добавил пример сортировки, поскольку видел, что вы упомянули об этом.

Чтобы узнать больше о linq.js перейдите на страницу проекта: http://linqjs.codeplex.com /