Как я могу повторить Python dict.items () в Javascript? - PullRequest
8 голосов
/ 17 марта 2011

В Javascript у меня есть объект JSON, из которого я хочу обработать только элементы:

var json = {
    itema: {stuff: 'stuff'},
    itemb: {stuff: 'stuff'},
    itemc: {stuff: 'stuff'},
    itemd: {stuff: 'stuff'}
}

В Python я могу сделать

print json.items()
[{stuff: 'stuff'},{stuff: 'stuff'},{stuff: 'stuff'},{stuff: 'stuff'}]

Могу ли я сделать это js?

Ответы [ 4 ]

3 голосов
/ 17 марта 2011

Вы не можете сделать это так же, как в python, не расширяя Object.prototype, чего вы не хотите делать, потому что это путь к страданию.

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

function items(obj) {
 var i, arr = [];
 for(i in obj) {
   arr.push(obj[i]);
 }
 return arr;
}

PS: JSON - это формат данных, у вас есть объектный литерал.

1 голос
/ 13 марта 2019

Благодаря последним обновлениям JavaScript - мы можем решить эту проблему сейчас:

function items(iterable) {
    return {
        [Symbol.iterator]: function* () {
            for (key in iterable) {
                yield [key, iterable[key]];
            }
        }
    };
}

for (const [key, val] of items({"a": 3, "b": 4, "c": 5})) {
    console.log(key, val);
}
// a 3
// b 4
// c 5

for (const [key, val] of items(["a", "b", "c"])) {
    console.log(key, val);
}
// 0 a
// 1 b
// 2 c
1 голос
/ 24 февраля 2017

В python dict.items возвращает список кортежей, содержащий ключи и значения dict.В Javascript нет кортежей, поэтому это должен быть вложенный массив.

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

>>> {1:2, 2:3}.items()
[(1, 2), (2, 3)]
>>> {1:2, 2:3}.values()
[2, 3]

Я вижуПринятый ответ возвращает массив значений объектов, который является эквивалентом функции python dict.values.То, что просят, это dict.items.Для этого просто зациклите и создайте вложенный массив из 2-х элементов.

function items(obj){

    var ret = [];
    for(v in obj){
        ret.push(Object.freeze([v, obj[v]]));
    }
    return Object.freeze(ret);
}

Я положил Object.freeze в педантичный режим и убедился, что возвращаемое значение не должно изменяться, чтобы эмулироватьнеизменность кортежей Python.Очевидно, что это все еще работает, если вы уберете его.

Следует отметить, что выполнение этого несколько противоречит цели items в том смысле, что он используется при итерации по объекту линейным, а не ассоциативным способом, и этоизбегает вычисления значения хеша для поиска каждого элемента в ассоциативном массиве.Для маленьких объектов, которые заботятся, но для больших, это может замедлить вас, и может быть более идиоматичный способ сделать то, что вы хотите в javascript.

Другой более новый способ сделать это - использовать Object.entry () , которая будет делать именно то, что вы хотите.

Object.entries({1:1, 2:2, 3:3})
      .forEach(function(v){
          console.log(v)
      });

Поддержка ограничена версиями браузера, упомянутыми в документации.

0 голосов
/ 17 марта 2011

Не уверен, что вы хотите сделать, но я думаю, что Json.stringify сделает что-то подобное.Смотри http://www.json.org/js.html

...