Получить имя ключа в паре ключ / значение в JSON, используя jQuery? - PullRequest
4 голосов
/ 07 апреля 2011

Скажите, у меня есть этот JSON:

[
    {
        "ID": "1",
        "title": "Title 1",
    },
    {
        "ID": "2",
        "title": "Title 2",
    }
]

Как бы я вернул набор имен ключей, которые повторяются для каждой записи? В этом случае ID, title.

Я пытался:

$.getJSON('testing.json', function(data) {
  var items = [];
  $.each(data, function(key, val) {
    items.push(key +', ');
  });

  $('<p/>', {
     html: items.join('')
  }).appendTo('#content');
});

без успеха.

Это JSON-база данных, и каждая «запись» имеет одинаковые ключи. Я просто хочу сценарий, который скажет мне, что это за ключи, а не проверяет, встречаются ли они в каждой записи.

Ответы [ 3 ]

5 голосов
/ 07 апреля 2011

Это даст вам массив всех строковых свойств, которые совпадают в массиве объектов.Это то, что вы ищете?

$.getJSON('testing.json', function(data) {
    var propertiesThatExistInAll = getPropertiesThatExistInAll(data);
});


var getPropertiesThatExistInAll = function(arr) {
    var properties = $.map(data[0], function (prop, value) {
        return prop;
    });

    var propertiesThatExistInAll = [];

    $.each(properties, function (index, property) {
        var keyExistsInAll = true;

        // skip the first one since we know it has all the properties
        for (var i = 1, len = data.length; i < len; i++) {
            if (!data[i].hasOwnProperty(property)) {
                keyExistsInAll = false;
                break;
            }
        }

        if (keyExistsInAll) {
            propertiesThatExistInAll.push(property);
        }
    });

    return propertiesThatExistInAll;
};
1 голос
/ 07 апреля 2011

Это, вероятно, можно сделать более эффективным / лаконичным, но функция ниже сделает это.

var testJson = [ {'oi' : 1, 'arf': 2, 'foo' : 0}, {'oi': 5, 'arf': 7}];

function commonKeys(j)
{

    var fillUp = [];
    for(var i in j[0])
       fillUp.push(i);

    for(var i = 1; i < j.length; i++)
    {
       var cur = j[i]; var curArr = [];
       for (var i in cur) {curArr.push(i)};
       fillUp = fillUp.filter(function(x) {return (curArr.indexOf(x) != -1);});
    }

    return fillUp;
}

alert(commonKeys(testJson)); //oi,arf (not foo)
1 голос
/ 07 апреля 2011

Что-то вроде этого, возможно?

items = [];
for (key in jsonobj) {
    if (!itemExists(items, key)) {
        items[items.length] = key
    }
}

function itemExists(items, value) {
    for (i = 0; i < items.length; i++) {
        if (items[i] == value) {
            return true
        }
    }
    return false;
}

Конечно, это вернет элементы, которые существуют в любых объектов, но не существуют во всех. Из вашего вопроса не совсем понятно, хотите ли вы этого решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...