JSON: получение объекта по атрибуту

#jquery #json

#jquery #json

Вопрос:

у меня есть такой json:

 {
    "page": {
        "id": 220,
        "parentId": 196,
        "property": {
            "1": {
                "name": "h1",
                "value": "value i dont need",
            },
            "2": {
                "name": "tags",
                "value": "value i dont need",
            },
            "3": {
                "name": "description",
                "value": "value i need",
            },
}
  

Вопрос в том, как я могу получить «нужное мне значение», если идентификатор свойства («3» в моем случае) динамично меняется?
Итак, я не могу просто использовать

 data.page.property[3].value
  

кстати, я использую jquery.

Спасибо!

— отредактировано из-за недопонимания

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

1. data.page.property[your_variable].value это должно сработать

2. если вы имеете в виду, что хотите получить третье свойство (не заботитесь / не уверены в его имени), вы можете использовать for ... in цикл в сочетании со счетчиком, если счетчик достигает значения 2 (третьего), затем получить доступ к свойству и разорвать цикл.

Ответ №1:

Если это будет случайный объект с какого-либо сервера, тогда вам нужно только повторить объект и сравнить то, что вам нужно,

 for(i in data.page.property)
{
     if(data.page.property[i].value amp;amp; data.page.property[i].value === "your value")
        // do your stuff
}
  

Ответ №2:

Чтобы получить определенное значение по имени, вы можете использовать такую функцию, как следующая:

 function getValue( name ) {
    var val = '';
    $.each(data.page.property, function(k,v) { 
        if( v.name == name ) {
            val = v.value;
            return false;
        }
    });
    return val;
};

console.log( getValue( "description" ) ); //output: value i need
console.log( getValue( "tags" ) ); //output: value i dont need
console.log( getValue( "h1" ) ); //output: value i dont need
  

РАБОЧАЯ ДЕМОНСТРАЦИЯ JSFIDDLE

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

1. я не могу использовать «3», потому что он динамично меняется. это может быть 2 или 5 разных раз.

2. Я обновил свой ответ и вскоре представлю демонстрацию.

3. @Rusher, я посмотрел на ваш обновленный JSON. Как вы решаете, что вам нужно? Это последний или по значению value i need ? Без разъяснения этого и того факта, что ваши требования постоянно меняются, вы не получите хорошего ответа.

4. по имени. я думал, что смогу сделать что-то вроде data.page.property[@name='description'].value

5. @Rusher, теперь это намного понятнее; имеет смысл. Я скоро обновлю свой ответ.

Ответ №3:

Перебирайте property -array, пока не найдете value поле. затем прочитайте его

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

1. но у меня много полей «значение». вероятно, мне нужно найти что-то вроде name=description .

2. затем повторяйте, пока не найдете правильное name поле

3. просто подумал, что data.page.property[@name='description'].value в xslt есть что-то подобное.

Ответ №4:

 var prop = data.page.property
for(k in prop)
{
  if(prop[k].name == 'name you are interested')
    var v = prop[k].value || someDefaultValue; 
    // do something about v
}
  

Ответ №5:

Только что написал эту общую функцию, которая может принимать любой объект / массив и находить объекты по атрибуту и его значению. Неважно, предоставляете ли вы массив, объект или массив объектов. Независимо от того, насколько глубока структура и т. Д. Он просто просмотрит все и найдет все объекты, у которых есть определенный атрибут, и его значение равно указанному значению. Это то, что я искал, когда нашел этот ответ, так что, надеюсь, кому-то это пойдет на пользу:

 
function findObjectWithKey(obj, key, value, results) {
  if (obj amp;amp; typeof obj === "object" amp;amp; Array.isArray(obj)) {
    obj.forEach((_obj) => {
      results = findObjectWithKey(_obj, key, value, results);
    });
  } else if (obj amp;amp; typeof obj === "object" amp;amp; Object.keys(obj)?.length > 0) {
    Object.keys(obj).forEach((_objKey) => {
      if (_objKey === key amp;amp; obj[_objKey] === value) {
        results.push(obj);
      }
      results = findObjectWithKey(obj[_objKey], key, value, results);
    });
  }
  return results;
}
  

Использовать:

const foundObjects = findObjectWithKey({some:{structure: false}}, 'structure', false, []);

Возврат: [{"structure":false}] ;

Ответ №6:

Чистый код Javascript

 for (var k in json.page.property) {
    var o = json.page.property[k];
    if (o.value) alert(o.value); //Make sure it only alerts if there is value
}
  

Демонстрационная скрипка

Ответ №7:

Надеюсь, что нужное вам значение относится к последнему члену объекта свойства,

 var len = Object.keys(json.page.property).length;
var myValue =json.page.property[len].value ;
console.log(myValue); // prints "value i need"