2015-05-23 2 views
1

Я делаю htmlparse из веб-страницы и я получаю DOM страницы с этого блока:Как удалить часть htmlparse?

{ raw: 'td', 
    data: 'td', 
    type: 'tag', 
    name: 'td', 
    children: [ { raw: '600', data: '600', type: 'text' } ] }, 

Как я могу удалить все типы «текст» этого htmlparse? Спасибо.

ответ

2

Если вы хотите удалить все текстовые узлы рекурсивно вы могли бы сделать это следующим образом:

var _ = require('underscore'); 
var deleteText = function(node) { 
    if (!node.children || node.children.length === 0) { 
     return; 
    } 

    // Exclude text nodes 
    node.children = _.filter(node.children, function(child) { 
     return child.type !== 'text'; 
    }); 

    // Recurse over child nodes 
    _.each(node.children, deleteText); 
}; 

deleteTextNodes(parsed); 
+1

Там нет причин, чтобы использовать 'delete' там. Просто используйте '.splice()'. И FYI ваш рекурсивный вызов требует «Узлов» в конце. –

+1

Также вы изменяете массив во время передовой итерации. Это приведет к тому, что он будет пропускать узел при каждом удалении. –

+1

Вы правы, спасибо! Я отредактировал свой ответ. –

1

Если вы хотите удалить любых детей с типом текста, просто переверните все ваши дети и используйте array.splice, чтобы удалить один раз с типом текста.

var output = document.getElementById('output'), 
 
    htmlParse = { raw: 'td', 
 
        data: 'td', 
 
        type: 'tag', 
 
        name: 'td', 
 
        children: [ 
 
         { raw: '600', data: '600', type: 'text' }, 
 
         { raw: '100', data: '100', type: 'num' } 
 
        ] 
 
        }; 
 

 
for(var i = 0; i < htmlParse.children.length; i++) { 
 
    if (htmlParse.children[i].type === "text") { 
 
    htmlParse.children.splice(i, 1); 
 
    } 
 
} 
 
output.innerHTML = JSON.stringify(htmlParse); 
 
console.log(htmlParse);
<div id="output"></div>

Смежные вопросы