Search code examples
javascriptlodashdomparser

Unable to filter array-like object


I want to retrieve [image] tags in the HTML, therefore I use DOMParser to parse the string into an object. However I am unable to get the image array when using ._filter by Lodash.

The strange part is that I able to get the result when using ._find.

I've searched solution online but unable to find something relevant to my case, kindly enlighten me. Thank you.

const content = '<!DOCTYPE html><html><head><meta name="keywords" content="seo, search engine optimisation, search engine optimization, search engine ranking"><meta name="description" content="A pages description, usually one or two sentences."/><title>Page title 123</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css"></head><body><h1>Hello there</h1><p><img src="https://fallbacks.carbonads.com/nosvn/fallbacks/731050e6bd3fc6979e1cb1a972294dae.png" class="fr-fic fr-dii"></p><a href="domain.com">This is domain</a><a href="domain.com2">This is domain2</a></body></html>';

let parser = new DOMParser(),
    parsedHtml = parser.parseFromString(content, 'text/html'),
    tagsInHtml = parsedHtml.all;

// ## Filter the data
let hrefArray   = _.filter(tagsInHtml, { "tagName": "A" }), // ??? Empty [] array
    hrefArray2  = _.find(tagsInHtml,   { "tagName": "A" }), // This working;

Attached with the JSFiddle


Solution

  • You need to convert your tags collection into an Array first:

    const content = '<!DOCTYPE html><html><head><meta name="keywords" content="seo, search engine optimisation, search engine optimization, search engine ranking"><meta name="description" content="A pages description, usually one or two sentences."/><title>Page title 123</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css"></head><body><h1>Hello there</h1><p><img src="https://fallbacks.carbonads.com/nosvn/fallbacks/731050e6bd3fc6979e1cb1a972294dae.png" class="fr-fic fr-dii"></p><a href="domain.com">This is domain</a><a href="domain.com2">This is domain2</a></body></html>';
    
    let parser = new DOMParser(),
        parsedHtml = parser.parseFromString(content, 'text/html'),
        tagsInHtml = parsedHtml.all,
        tags = Array.from(tagsInHtml);
        
    // Filter the data
    let hrefArray = _.filter(tags, { 'tagName': 'A' }),
        hrefArray2 = _.find(tags, { 'tagName': 'A' });
        
    console.dir(hrefArray);
    console.dir(hrefArray2);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>