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

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

{
    "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-е число, оно может быть единственным числом или иметь глубину в сотни с несколькими дубликатами между ними. Моя цель состоит в том, чтобы найти этот самый высокий и сделать цикл «за» или «пока», основываясь на этом, чтобы сгруппировать их вместе на визуальном дисплее. Пример уведомления У меня есть один hostidn ниже с номером 2, в то время как все остальные имеют свои собственные. Я хотел бы сгруппировать два с 2 вместе в поле для отображения, но в этом сценарии есть 5 разных hostidn. Я не знаю, может быть, я думаю об этом неправильно, я приму предложения, однако.

Ответы [ 3 ]

1 голос
/ 11 октября 2011

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

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

$ 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');
});
0 голосов
/ 11 октября 2011

Мне нравится использовать 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/

0 голосов
/ 11 октября 2011

Возвращает массив, содержащий один или несколько объектов с наибольшим идентификатором.Также см. 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...