Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.11.2014, 17:06
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Object.traverse() / Рекурсивный обход объекта
Обходит дерево (JavaScript Object) "рекурсивно" и вызывает функцию для каждого ключа узла

https://github.com/nervgh/object-traverse
  • горизонтальный/вертикальный способы обхода
  • возможность пропускать узлы
  • прерывание обхода в любой точке
  • отслеживание циклических ссылок (бросается исключение) или их пропуск
  • регулирование глубины обхода

/*
 object-traverse v0.1.0
 [url]https://github.com/nervgh/object-traverse[/url]
*/
!function(a){"use strict";function b(a){return a instanceof Object}function c(a){return"number"==typeof a&&!h(a)}function d(a,c,d,e,f,h){var i=[[],0,g(a).sort(),a],j=[];do{var k=i.pop(),l=i.pop(),m=i.pop(),n=i.pop();for(j.push(k);l[0];){var o=l.shift(),p=k[o],q=n.concat(o),r=c.call(d,k,p,o,q,m);if(r!==!0){if(r===!1){i.length=0;break}if(!(m>=h)&&b(p)){if(-1!==j.indexOf(p)){if(f)continue;throw new Error("Circular reference")}if(!e){i.push(n,m,l,k),i.push(q,m+1,g(p).sort(),p);break}i.unshift(q,m+1,g(p).sort(),p)}}}}while(i[0])}function e(a,b,e,g,h,i){var j=b,k=e,l=1===g,m=!!h,n=c(i)?i:f;d(a,j,k,l,m,n)}var f=100,g=Object.keys,h=a.isNaN;Object.traverse=e}(window);


var object = {
    foo: {
        bar: {
            number: 1,
            string: 'walker',
            array: [
                undefined,
                NaN
            ],
            date: new Date()
        }
    }
};

Object.traverse(object, function(node, value, key, path, depth) {
    console.log(path.join('.'), value);
});

// foo    Object {bar: Object}
// foo.bar    Object {number: 1, string: "walker", array: Array[2], date: Sat Nov 22 2014 14:05:45 GMT+0300 (Московское время (зима))}
// foo.bar.array    [undefined, NaN]
// foo.bar.array.0    undefined
// foo.bar.array.1    NaN
// foo.bar.date    Sat Nov 22 2014 14:05:45 GMT+0300 (Московское время (зима))
// foo.bar.number    1
// foo.bar.string    walker
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #2 (permalink)  
Старый 25.11.2014, 00:10
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Пример: преобразуем строки в числа на всех уровнях
/*
 object-traverse v0.1.0
 [url]https://github.com/nervgh/object-traverse[/url]
*/
!function(a){"use strict";function b(a){return a instanceof Object}function c(a){return"number"==typeof a&&!h(a)}function d(a,c,d,e,f,h){var i=[[],0,g(a).sort(),a],j=[];do{var k=i.pop(),l=i.pop(),m=i.pop(),n=i.pop();for(j.push(k);l[0];){var o=l.shift(),p=k[o],q=n.concat(o),r=c.call(d,k,p,o,q,m);if(r!==!0){if(r===!1){i.length=0;break}if(!(m>=h)&&b(p)){if(-1!==j.indexOf(p)){if(f)continue;throw new Error("Circular reference")}if(!e){i.push(n,m,l,k),i.push(q,m+1,g(p).sort(),p);break}i.unshift(q,m+1,g(p).sort(),p)}}}}while(i[0])}function e(a,b,e,g,h,i){var j=b,k=e,l=1===g,m=!!h,n=c(i)?i:f;d(a,j,k,l,m,n)}var f=100,g=Object.keys,h=a.isNaN;Object.traverse=e}(window);

// ---------------------------

function copy(any) {
    return JSON.parse(JSON.stringify(any));
}

function isString(any) {
    return typeof any === 'string';
}

function isNumberLikeString(string) {
    return /^\d+(.\d+)?$/.test(string);
}

// ---------------------------

var data = {
    delivery: ["7", "24", "35"],
    mode: "0",
    page: "1",
    price: ["0", "33800"]
};

console.log('before', copy(data));

Object.traverse(data, function(node, value, key) {
    if (isString(value) && isNumberLikeString(value)) {
        node[key] = Number(value);
    }
});

console.log('after', copy(data));
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 25.11.2014 в 10:25.
Ответить с цитированием
  #3 (permalink)  
Старый 14.12.2014, 13:22
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Object.toFormData()
Object.toFormData()

Конвертирует объект с файлами, списками файлов и блоб объектами в FormData (на основе Object.traverse)

Пример использования
// convert object to [FormData]
var form = Object.toFormData({
    foo: {
        bar: {
             number: 1,
             file: '[File]'
        }
    }
});

// send this object
var xhr = new XMLHttpRequest();
xhr.open('POST', '/');
xhr.onload = function() {
    alert(xhr.responseText);
};
xhr.send(form);

Последний раз редактировалось nerv_, 14.12.2014 в 15:13.
Ответить с цитированием
  #4 (permalink)  
Старый 14.12.2014, 14:48
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от nerv_
toFromData
Сообщение от nerv_
FormData
опечатка?

исчо: UMD

Последний раз редактировалось melky, 14.12.2014 в 14:59.
Ответить с цитированием
  #5 (permalink)  
Старый 14.12.2014, 15:07
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от melky
опечатка?
да, именно она Полез исправлять) Спасибо, плюсы уже не ставит)

Сообщение от melky
исчо: UMD
намекаешь на обертку для модуля?)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 14.12.2014 в 15:11.
Ответить с цитированием
  #6 (permalink)  
Старый 14.12.2014, 15:16
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от nerv_
намекаешь на обертку для модуля?)
да, модуля для всех случаев - script \ AMD \ Commonjs.


... ты будешь в NPM\bower заливать?
Ответить с цитированием
  #7 (permalink)  
Старый 14.12.2014, 15:29
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от melky
ты будешь в NPM\bower заливать?
В bower уже залито
http://bower.io/search/?q=object-traverse
http://bower.io/search/?q=object-to-formdata

Сообщение от melky
модуля для всех случаев - script \ AMD \ Commonjs.
сделаешь PR?)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (permalink)  
Старый 14.12.2014, 16:36
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

nerv_, функцию продавать думаешь, коли обфусцировал?
Ответить с цитированием
  #9 (permalink)  
Старый 14.12.2014, 18:48
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от bes
nerv_, функцию продавать думаешь, коли обфусцировал?
исходники по ссылкам в первом посте и в этом посте
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 14.12.2014 в 18:51.
Ответить с цитированием
  #10 (permalink)  
Старый 04.03.2015, 19:55
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Object.traverse() устарел. См. Recursive Iterator
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта. Zemsky Общие вопросы Javascript 30 19.12.2013 19:44
Обход методов объекта Как? bogong Events/DOM/Window 5 13.09.2013 13:53
Скрипт вычисления координат объекта banderasantonio197555 Events/DOM/Window 4 16.08.2011 17:37
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00
Не работает перебор свойств объекта BANick Общие вопросы Javascript 1 16.09.2008 22:46