Приветствую! Я очень заинтересовался проектом, и решил изучить его "внутренности". В ридми есть пример кода ``` javascript var postcss = require('postcss'); var postprocessor = postcss(function (css) { css.eachRule(function (rule) { if ( rule.selector.match(/::(before|after)/) ) { var good = rule.some(function (i) { return i.prop == 'content'; }); if ( !good ) { rule.prepend({ prop: 'content', value: '""' }); } } }); }); ``` Позже я нашел, что eachRule — такой же метод как и обычный Array.forEach. Почему бы не использовать нативный метод forEach, вместо самописного? Обычная работа с массивами позволяет делать много разных вещей, и код может получится "относительно" проще. Например, код из ридми можно написать так: ``` javascript var postcss = require('postcss'); var postprocessor = postcss(function (css) { css.rules.filter(function(rule){ return rule.selector.match(/::(before|after)/) && rule.every(function(i){ return i.prop !== 'content'; }); }).forEach(function (rule) { rule.prepend({ prop: 'content', value: '""' }); }); }); ``` Кроме того, список свойств для правила можно описать в виде примитивного объекта: ``` javascript var postcss = require('postcss'); var postprocessor = postcss(function (css) { css.rules.filter(function(rule){ return rule.selector.match(/::(before|after)/) && !rule.props.hasOwnProperty('content'); }).forEach(function (rule) { rule.props.content = ''; }); }); ```
Activity
ai commentedon Nov 4, 2013
Нативный метод не безопасный — он не создавался с учётом, что кто-то будет менять массив в течении итератора.
Например:
выведет:
Потому что в процессе цикла размер массива будет меняться.
ai commentedon Nov 4, 2013
Но можно и вручную ходить по массиву.
css.rulesиrule.decls— обычные массивы.alexeyraspopov commentedon Nov 4, 2013
Вероятно я не нашел открытые поля
rulesиdecls. По сути это то, что я и искал.В случае с
decls, если описывать свойства в виде объекта, можно избежать проблемы с методом forEach и удалением:ai commentedon Nov 4, 2013
Хороший способ! Может быть воспользуюсь им в следующих версиях.
Но в общем
Container.each— это просто алиас кforEachс дополнительными проверками.А вот
Container.eachDeclиContainer.eachRuleне совсем аналогforEach— это рекурсивные итераторы проходящие по всем вложенным правилам.