А началось все с того, что я написал код, где в цикле создавались анонимные функции. Что-то вроде этого:
(function(arr) { arr.forEach(function(item) { Object.keys(item).forEach(function(key) { if (item[key] === null) delete item[key]; }); }); console.log(arr); })([{a: 1, b: null}, {a: 2, b: null}]);
Результат выполнения в консоли браузера выглядит примерно так:
На первый взгляд никакого криминала, но то, что в первом цикле каждый раз содается анонимная функция для использовани ее во вложенном цикле мне не понравилось, поэтому я решил сделать проще:
(function(arr) { arr.forEach(function(item) { for (var key in item) { if (item[key] === null) delete item[key]; } }); console.log(arr) })([{a: 1, b: null}, {a: 2, b: null}]);На этом мои претензии к качеству закончились, но по ходу появилось новое условие в виде дополнительного аргумента:
(function(arr, arg) { arr.forEach(function(item) { for (var key in item) { if (item[key] === null) delete item[key]; if (typeof arg === 'number') item.c = arg; } }); console.log(arr) })([{a: 1, b: null}, {a: 2, b: null}], 0);
И здесь мне не понравилось то, что во вложенном цикле я каждый раз проверяю тип параметра arg, зная о его наличии еще до начала первого цикла. В результате появилось подобное чудовище:
(function(arr, arg) { arr.forEach(typeof arg === 'number' ? function(item) { for (var key in item) { if (item[key] === null) delete item[key]; item.c = arg; } } : function(item) { for (var key in item) { if (item[key] === null) delete item[key]; } }); console.log(arr) })([{a: 1, b: null}, {a: 2, b: null}], 0);
Работает оно как надо:
Но есть и более "изящный" вариант с использованием глобального метода eval():
(function(arr, arg) { arr.forEach(eval( '(function(item) {' + 'for (var key in item) {' + 'if (item[key] === null) delete item[key];' + (typeof arg === 'number' ? 'item.c = arg;' : '') + '}' + '})' )); console.log(arr) })([{a: 1, b: null}, {a: 2, b: null}], 0);
Вот такая история. Тем кого заинтересовала эта тема предлагаю подумать почему вариант с использованием конструктора Function() не прокатит:
(function(arr, arg) { arr.forEach(new Function('item', 'for (var key in item) {' + 'if (item[key] === null) delete item[key];' + (typeof arg === 'number' ? 'item.c = arg;' : '') + '}' )); console.log(arr) })([{a: 1, b: null}, {a: 2, b: null}], 0);
Подсказка - все дело в замыканиях.
На этом прощаюсь. Всем мир.
Комментариев нет:
Отправить комментарий
Комментарий будет опубликован после модерации