2014-10-11 2 views
-3

Каков наилучший способ показать все элементы с соответствующими значениями с помощью JSON?Используйте JavaScript для возврата элементов, соответствующих JSON

Так что, если у меня есть этот пример JSON:

{ 
    "AllQuotes": [{ 
     "Quote": "Life is Bad", 
      "Attributes": { 
      "StatedYear": 1999, 
       "smart": true, 
       "inspiring": false 
     } 
    }, { 
     "Quote": "Life is Good", 
      "Attributes": { 
      "StatedYear": 1972, 
       "smart": false, 
       "inspiring": true 
     } 
    }, { 
     "Quote": "Let's Party", 
      "Attributes": { 
      "StatedYear": 1999, 
       "smart": false, 
       "inspiring": true 
     } 
    }, { 
     "Quote": "All is a Game", 
      "Attributes": { 
      "StatedYear": 1952, 
       "smart": true, 
       "inspiring": false 
     } 
    }] 
} 

Использование простой JavaScript, как вытащить все цитаты из 1999? или все цитаты с атрибутом inspiring = true?

+0

И «лучший» субъективное слово. Лучше всего с точки зрения производительности? Ясность кода? Использование памяти? Лаконичность? –

+0

Этот вопрос очень неясен. –

ответ

2

«Лучший» может означать любое количество вещей. я бы, вероятно, сделать это:

var obj = /* ...deserialize the JSON ...*/; 
var quotesSince1999 = obj.AllQuotes.filter(function(quote) { 
    return quote.StatedYear >= 1999; 
}); 

Это использует Array#filter функцию из ES5, который может быть подкладками на (в небольшом количестве) старых браузеров. Он возвращает массив, содержащий записи, для которых вы передаете функцию компаратора, возвращает правдивое значение. Результат в quotesSince1999 представляет собой массив, содержащий только те кавычки, где StatedYear является >= 1999.

0

Итак, чтобы получить конкретный объект узла, мы будем использовать приведенную выше функцию.

Демо здесь:http://jsfiddle.net/csdtesting/nzLnofhz/

Реализация:

var data = [{ 
 
    "AllQuotes": [{ 
 
    "Quote": "Life is Bad", 
 
    "Attributes": { 
 
     "StatedYear": 1999, 
 
     "smart": true, 
 
     "inspiring": false 
 
    } 
 
    }, { 
 
    "Quote": "Life is Good", 
 
    "Attributes": { 
 
     "StatedYear": 1972, 
 
     "smart": false, 
 
     "inspiring": true 
 
    } 
 
    }, { 
 
    "Quote": "Let's Party", 
 
    "Attributes": { 
 
     "StatedYear": 1999, 
 
     "smart": false, 
 
     "inspiring": true 
 
    } 
 
    }, { 
 
    "Quote": "All is a Game", 
 
    "Attributes": { 
 
     "StatedYear": 1952, 
 
     "smart": true, 
 
     "inspiring": false 
 
    } 
 
    }] 
 
}]; 
 
var getSpecificObjects = function getObjects(obj, key, val) { 
 
    var objects = []; 
 
    for (var i in obj) { 
 
     if (!obj.hasOwnProperty(i)) continue; 
 
     if (typeof obj[i] == 'object') { 
 
     objects = objects.concat(getObjects(obj[i], key, val)); 
 
     } else 
 

 
     if (i == key && obj[i] == val || i == key && val == '') { // 
 
     objects.push(obj); 
 
     } else if (obj[i] == val && key == '') { 
 
     //only add if the object is not already in the array 
 
     if (objects.lastIndexOf(obj) == -1) { 
 
      objects.push(obj); 
 
     } 
 
     } 
 
    } 
 
    return objects; 
 
    } 
 
    //First one pull all quotes from 1999 
 
var allQuotes1999 = getSpecificObjects(data, "StatedYear", "1999"); 
 
console.log(allQuotes1999); 
 
//all quotes with attribute inspiring = true 
 
var allQuotesInspiring = getSpecificObjects(data, "inspiring", true); 
 
console.log(allQuotesInspiring);

Ваш результат состоит из двух объектов, содержащих только узлы с заданными значениями (* см консоль после запуска кода):

enter image description here

Надеюсь, это поможет!

0

Вы можете использовать эту функцию для поиска в Json либо значения или ключ или оба:

function searchJson(obj, key, val) { 
    var objects = []; 
    for (var i in obj) { 
     if (!obj.hasOwnProperty(i)) continue; 
     if (typeof obj[i] == 'object') { 
      objects = objects.concat(getObjects(obj[i], key, val));  
     } else 
     if (i == key && obj[i] == val || i == key && val == '') { // 
      objects.push(obj); 
     } else if (obj[i] == val && key == ''){ 
      //only add if the object is not already in the array 
      if (objects.lastIndexOf(obj) == -1){ 
       objects.push(obj); 
      } 
     } 
    } 
    return objects; 
} 

Вы можете использовать эту функцию, как это: Предполагая OBJ твой Json Объект,

getObjects(obj,"StatedYear","1999"); 

И он вернет искомый объект, Вы также можете использовать его так, чтобы все значения соответствовали «1999» следующим образом:

getObjects(obj,"","1999"); 

Или, как это который будет возвращать все объекты, имеющие «StatedYear» в качестве ключевого

getObjects(obj,"StatedYear"); 
Смежные вопросы