Объект карте() / трансмутировать() метод


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

Это моя реализация:

Object.map = function _map( obj, transform ) {
    if( typeof obj === 'object' && typeof transform === 'function' ) {
        Object.keys( obj ).forEach(function _forEach( key ) {
            (function _mapping( oldkey, transmuted ) {
                if( transmuted && transmuted.length ) {
                    obj[ transmuted[ 0 ] || oldkey ] = transmuted[ 1 ];

                    if( transmuted[ 0 ] && oldkey !== transmuted[ 0 ] ) {
                        delete obj[ oldkey ];
                    }
                }
            }( key, transform.apply( obj, [ key, obj[ key ]] ) ));
        });
    }
};

Я обычно положить его на объект, а не прототип. Тем не менее, использование такой

var foo = {
    someProp: 5,
    bar: 10,
    moar: 20
};

Object.map( foo, function(key, value) {
    return [ key.toUpperCase(), value*2 ];
});

результат:

Object { SOMEPROP=10, BAR=20, MOAR=40}

Я чаще всего использую его для перевода свойств CSS (поставщика префиксы). Но я не вижу людей использовать такой подход часто в ECMAScript. Какие мысли?



4781
2
задан 22 ноября 2011 в 12:11 Источник Поделиться
Комментарии
1 ответ

Первый комментарий, там нет необходимости для закрытия внутри _forEach, что делает код излишне сложным для чтения. Что более важно, я утверждаю, что функция будет гораздо полезнее, если бы не превратить исходный объект, а вместо этого возвращается новый объект.

Object.map = function (obj, mapping) {
var mapped = {};

if (typeof obj !== 'object') {
return mapped;
}

if (typeof mapping !== 'function') {
// We could just return obj but that wouldn't be
// consistent with the rest of the interface which always returns
// a new object.
mapping = function (key, val) {
return [ key, val ];
};
}

Object.keys( obj ).forEach(function (key) {
var transmuted = mapping.apply(obj, [ key, value ]);

if (transmuted && transmuted.length) {
mapped[ transmuted[0] || key ] = kv[ 1 ];
}
});

return mapped;
};

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

Object.map(oldCss, function (key, value) {
// ...
}).doSomethingElse();

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

3
ответ дан 24 ноября 2011 в 06:11 Источник Поделиться