Возможно ли функционально пройти объекты в JavaScript? - PullRequest
0 голосов
/ 23 декабря 2009

Я думаю, что в JavaScript нет ничего похожего на obj.first , но мне было интересно, можно ли что-то подобное сделать каким-либо образом:

var foobar = { aint: "foo", an: "bar", array: "foobar" };
var recursiveObjDump = function (obj, idx) {
    if (idx == obj.last.index) return obj[idx];
    else return obj[idx] + " " + recursiveObjDump(obj, obj[idx].next.index);
};

alert( recursiveObjDump(foobar, foobar.first.index) );

Спасибо.

Ответы [ 3 ]

2 голосов
/ 23 декабря 2009

Не совсем. Объекты в Javascript - это ассоциативные массивы - наборы пар ключ / значение. Указанный порядок отсутствует, как в математическом наборе (сравните с последовательностью ). Поэтому искать что-то вроде object.first бессмысленно.

С другой стороны, вы можете абсолютно навязать свою собственную структуру поверх этого. Например, вы можете реализовать списки в стиле Lisp в Javascript и повторять их. Это довольно аккуратная статья об использовании методов функционального программирования в Javascript.

В конце концов, Javascript является объектно-ориентированным, а не функциональным, так что вы просто не найдете эти функциональные примитивы, реализованные изначально.

Редактировать: Если вы все еще хотите использовать методы функционального программирования в Javascript, взгляните на Функциональный Javascript .

1 голос
/ 23 декабря 2009

Если вы просто хотите сериализовать объект, используйте JSON.stringify () . Он является родным в Javascript 5, и вы можете скачать скрипт с сайта Крокфорда для более низких версий javascript. (тот же сценарий может снова безопасно обработать сериализацию объекта JSON обратно в объект javascript)

1 голос
/ 23 декабря 2009

Вы можете использовать for in для просмотра всех свойств.

Это базовый вариант, вы можете добавить лучшее обнаружение для поиска массивов и тому подобного.

var foobar = { aint: "foo", an: "bar", array: "foobar" };

function recusiveDump(obj) {
    var output = '';
    for(var i in obj) {
        if(obj.hasOwnProperty(i)) {
            if(typeof obj[i] == 'object') {
                output += recusiveDump(obj[i]);
            } else {
                output += obj[i];
            }
        }
    }
    return output;
}

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