Это будет делать одна строчка,
var ary = ['three', 'seven', 'eleven'];
// Remove item 'seven' from array
var filteredAry = ary.filter(function(e) { return e !== 'seven' })
//=> ["three", "eleven"]
// In ECMA6 (arrow function syntax):
var filteredAry = ary.filter(e => e !== 'seven')
. В JS используется функция фильтра . Поддерживается в IE9 и выше.
Что он делает (из ссылки на документацию)
filter () вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве и создает новый массив из всех значений, для которых возвращается обратный вызов значение, которое приводит к истине. обратный вызов вызывается только для индексов массива, которым присвоены значения; он не вызывается для индексов, которые были удалены или которым никогда не присваивались значения. Элементы массива, которые не проходят тест обратного вызова, просто пропускаются и не включаются в новый массив.
Таким образом, в основном, это то же самое, что и все другие решения for (var key in ary) { ... }
, за исключением того, что конструкция for in
поддерживается в IE6.
По сути, фильтр - это удобный метод, который выглядит намного лучше (и является цепным) в отличие от конструкции for in
(AFAIK).
py> ast._fields
('body',)
py> ast.body
[<_ast.Import object at 0xb7978e8c>, <_ast.Expr object at 0xb7978f0c>]
py> ast.body[1]
<_ast.Expr object at 0xb7978f0c>
py> ast.body[1]._fields
('value',)
py> ast.body[1].value
<_ast.Call object at 0xb7978f2c>
py> ast.body[1].value._fields
('func', 'args', 'keywords', 'starargs', 'kwargs')
py> ast.body[1].value.args
[<_ast.Str object at 0xb7978fac>]
py> ast.body[1].value.args[0]
<_ast.Str object at 0xb7978fac>
py> ast.body[1].value.args[0]._fields
('s',)
py> ast.body[1].value.args[0].s
'.'
HTH
Таким образом вы получаете все дерево целиком - вплоть до самого низа - но оно СОЗДАЕТСЯ как дерево, именно ... поэтому на каждом уровне, чтобы получить детей, вы должны явно посещать необходимые атрибуты. Например (я называю compile
result cf
, а не ast
, потому что это скроет модуль ast стандартной библиотеки - я предполагаю, что у вас только 2,5, скорее чем 2.6, поэтому вы используете вместо него модуль нижнего уровня _ast
?) ...:
>>> cf.body[0].names[0].name
'os'
Это то, что сообщает вам, что оператор импорта импортирует имя os
(и только потому, что 1 - это длина поля .names
в .body [0]
, которое является импортом
).
In Python 2.6 ' В модуле ast
вы также получаете помощников, позволяющих упростить навигацию по дереву (например, с помощью шаблона проектирования Visitor
) - но все дерево присутствует либо в 2.5 (с _ast
) или 2.5 (с ast
), и в любом случае представлен точно таким же образом.
Для удобного посещения всех узлов в дереве в 2.6 используйте модуль ast (без символа подчеркивания в начале) и подкласс ast.NodeVisitor
по мере необходимости (или эквивалентно рекурсивно используйте ast.iter_child_nodes
и ast.iter_fields
по мере необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast
, если вы по какой-то причине застряли в 2.5.
Visitor
), но все дерево присутствует либо в 2.5 (с _ast
), либо в 2.5 (с ast
), и в любом случае представлен точно таким же образом.
Чтобы удобно посещать все узлы в дереве, в 2.6 используйте модуль ast (без подчеркивания в начале) и подкласс ast.NodeVisitor
в зависимости от ситуации (или эквивалентно используйте ast.iter_child_nodes
рекурсивно и ast.iter_fields
по мере необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast
, если вы по какой-то причине застряли в 2.5.
Visitor
), но все дерево присутствует либо в 2.5 (с _ast
), либо в 2.5 (с ast
), и в любом случае представлен точно таким же образом.
Чтобы удобно посещать все узлы в дереве, в 2.6 используйте модуль ast (без подчеркивания в начале) и подкласс ast.NodeVisitor
в зависимости от ситуации (или эквивалентно используйте ast.iter_child_nodes
рекурсивно и ast.iter_fields
по мере необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast
, если вы по какой-то причине застряли в 2.5.
ast.NodeVisitor
в зависимости от ситуации (или эквивалентным образом используйте рекурсивно ast.iter_child_nodes
и ast.iter_fields
по мере необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast
, если вы по какой-то причине застряли в 2.5. используйте модуль ast (без начального подчеркивания) и подкласс ast.NodeVisitor
в зависимости от ситуации (или эквивалентным образом используйте рекурсивно ast.iter_child_nodes
и ast.iter_fields
по мере необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast
, если вы по какой-то причине застряли в 2.5.