Как вытащить конкретное значение ключа из JSON Array в Javascript [дубликат]

Я думаю, что предыдущий зеленый ответ был плохим, почему вы можете спросить?

  • Он добавляет много кода
  • Он требует, чтобы вы перечислили все поля, которые нужно скопировать и делать это
  • Это не будет работать для списков при использовании clone () (Это то, что clone () для HashMap говорит: возвращает неглубокую копию этого экземпляра HashMap: ключи и ценности не клонируются.) так что вы в конечном итоге делаете это вручную (это заставляет меня плакать)

О, и, кстати, сериализация также плоха, вам, возможно, придется добавить Serializable повсюду (это также заставляет меня плакать ).

Итак, каково решение:

Библиотека глубокого клонирования Java Библиотека клонирования - это небольшая библиотека Java с открытым исходным кодом (apache license), которая глубокие клоны. Объектам не нужно реализовывать интерфейс Cloneable. Эффективно, эта библиотека может клонировать ЛЮБЫЕ java-объекты. Его можно использовать, то есть в реализациях кеша, если вы не хотите, чтобы кешированный объект был изменен или когда вы хотите создать глубокую копию объектов.

Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);

Проверьте это на https://github.com/kostaskougios/cloning

32
задан Stefan Konno 10 August 2009 в 11:49
поделиться

6 ответов

вы можете использовать функцию each:

var a = {};
a['alfa'] = 0;
a['beta'] = 1;
$.each(a, function(key, value) {
      alert(key)
});

у нее есть несколько хороших ярлыков / трюков: проверьте детали gory здесь

57
ответ дан dfa 22 August 2018 в 23:59
поделиться
  • 1
    и что делает $ .each () внутренне для объектов ?! Этот метод будет медленнее, поскольку использование функции обратного вызова увеличит длину цепочки областей видимости и, следовательно, займет больше времени, чтобы решить ссылку на свойства – Russ Cam 10 August 2009 в 16:07
  • 2
    Не забудьте использовать фигурные скобки вместо квадратных скобок, чтобы определить массив! – tecmec 29 December 2011 в 12:38
  • 3
    console.log (ключ) будет работать лучше для длинного списка и т. д. – Andrew Day 30 May 2017 в 19:02
console.log( Object.keys( {'a':1,'b':2} ) );
27
ответ дан Andy 22 August 2018 в 23:59
поделиться

Используя jQuery, самый простой способ получить массив ключей из объекта следующий:

$.map(obj, function(element,index) {return index})

В вашем случае он вернет этот массив: ["alfa", "beta"]

49
ответ дан dugokontov 22 August 2018 в 23:59
поделиться
  • 1
    Это было здорово, спасибо! – Jimbo 1 July 2013 в 16:21
  • 2
    Одно из незначительных отличий от Object.keys заключается в том, что версия JQuery (протестированная с помощью JQuery v1.6.2 и v1.8.2) возвращает ключи массива (индексы) в виде целых чисел, а не Object.keys, возвращающие их как строки. Хотя это не будет проблемой в 99,999% случаев ... – Vajk Hermecz 12 March 2014 в 06:44

Не переустанавливайте колесо, используйте Underscore

Я знаю, что OP специально упомянул jQuery, но я хотел поставить здесь ответ, чтобы познакомить людей с полезными Подчеркните библиотеку, если они уже не знают об этом.

Используя метод keys в библиотеке Underscore , вы можете просто сделать следующее:

_.keys(foo)  #=> ["alfa", "beta"]

Кроме того, существует множество других полезных функций, заслуживающих внимания.

4
ответ дан Joshua Pinter 22 August 2018 в 23:59
поделиться

Я использую что-то вроде этой функции, которую я создал ...

Object.getKeys = function(obj, add) {
    if(obj === undefined || obj === null) {
        return undefined;
    }
    var keys = [];
    if(add !== undefined) {
        keys = jQuery.merge(keys, add);
    }
    for(key in obj) {
        if(obj.hasOwnProperty(key)) {
                keys.push(key);
        }
    }
    return keys;
};

Я думаю, вы могли бы установить obj для себя или что-то лучше в первом тесте. Кажется, иногда я проверяю, слишком ли он пуст, поэтому я сделал это таким образом. Также я не думаю, что {} есть Object. * Или, по крайней мере, есть проблема с поиском функции getKeys на объекте таким образом. Возможно, вы предполагаете сначала поставить прототип, но это, похоже, вызывает конфликт с GreenSock и т. Д.

0
ответ дан MistereeDevlord 22 August 2018 в 23:59
поделиться
  • 1
    Даже здесь он сделал что-то подобное. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Я думал, что можно предположить, что нужно просто использовать ключи (), но он не был полностью имплантирован, поэтому я перевернул собственный как я часто это делаю. – MistereeDevlord 1 May 2014 в 21:54

Используйте объект (пары ключ / значение, ближайший JavaScript для ассоциативного массива) для этого, а не для объекта массива. Кроме этого, я считаю, что это самый элегантный способ

var foo = {};
foo['alfa'] = "first item";
foo['beta'] = "second item";

for (var key in foo) {
        console.log(key);
}

Примечание: JavaScript не гарантирует какого-либо конкретного порядка для свойств. Таким образом, вы не можете ожидать, что свойство, которое сначала было определено первым, оно может наступить последним.

EDIT:

В ответ на ваш комментарий, я считаю, что эта статья наилучшим образом суммируются случаи, почему массивы в JavaScript не должны использоваться таким образом -

6
ответ дан Russ Cam 22 August 2018 в 23:59
поделиться
  • 1
    Спасибо за примечание, к счастью, это не имеет значения для меня в этом конкретном случае. :) Но только один вопрос, почему лучше иметь его как объект (ассоциативный массив)? – Stefan Konno 10 August 2009 в 12:02
Другие вопросы по тегам:

Похожие вопросы: