Пытаться найти свойство рекурсивно в JavaScript - PullRequest
0 голосов
/ 23 января 2020

**UPDATE**

/* This is my file in Node: */

var Crawler = require("crawler");
const fs = require('fs');

function iterObj(obj) {
let arr = []
let objValues = Object.values(obj);
// use var to avoid additonal heap overhead of new variable for each iteration
for (var i = 0, len = objValues.length; i < len; i++) {
    if (objValues[i] !== null) {
        if (objValues[i].children || objValues[i].next || objValues[i].prev || objValues[i].parent) {
            delete objValues[i].children;
            delete objValues[i].next;
            delete objValues[i].prev;
            delete objValues[i].parent;
        }
        if (objValues[i].src) { arr.push({ src: objValues[i].src }) }

        console.log("contents of arr on line 29 ", arr);
        if (typeof objValues[i] === "object" && !Array.isArray(objValues[i])) {
            arr.push(...iterObj(objValues[i]));
        }
    }
}
return arr;
}



var c = new Crawler({
maxConnections: 10,
// This will be called for each crawled page
callback: function(error, res, done) {
    if (error) {
        console.log(error);
    } else {
        var $ = res.$;
        // $ is Cheerio by default
        //a lean implementation of core jQuery designed specifically for the server;
        var img = $(`img`);

        console.log('img', img);
        console.log('iterObj(img)', iterObj(img))


        // fs.writeFile('fragrance.js', img, (err) => {
        //     if (err) throw err;
        //     console.log(`img`, img);
        //     console.log(`iterObj(img)`, iterObj(img));


        //     console.log('Data written to file.')
        // })

    }
    done();
}
});


c.queue('https://www.elizabetharden.com/fragrance/')


And this is the data, a javascript object.

img initialize {
  '0':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         '/on/demandware.static/Sites-ElizabethArden-Site/-/default/dwbde506b9/images/ELIZABETH_ARDEN_LOGO_640x90.png',
        alt: 'Elizabeth Arden' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'picture',
        attribs: {},
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '1':
   { type: 'tag',
     name: 'img',
     attribs:
      { alt: 'Fragrance Collection',
        src:
         'https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dwd973092c/images/category-landing/D_White_Tea_Fragrance_Page_Banner-bg.jpg',
        srcset:
         'https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dwd973092c/images/category-landing/D_White_Tea_Fragrance_Page_Banner-bg.jpg, https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dw62e6fa40/images/category-landing/D_White_Tea_Fragrance_Page_Banner@2x-bg.jpg 2x' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'picture',
        attribs: {},
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '2':
   { type: 'tag',
     name: 'img',
     attribs:
      { alt: 'My Fifth Avenue Fragrance',
        src:
         'https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dw255d9a03/images/category-landing/myfifthavenue_1100x1100.jpg',
        srcset:
         'https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dw255d9a03/images/category-landing/myfifthavenue_1100x1100.jpg' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'picture',
        attribs: {},
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '3':
   { type: 'tag',
     name: 'img',
     attribs:
      { alt: 'Elizabeth Arden Green Tea Perfume',
        src:
         'https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dw8c63d4b5/images/category-landing/green-tea_1100x1100.jpg',
        srcset:
         'https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dw8c63d4b5/images/category-landing/green-tea_1100x1100.jpg' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'picture',
        attribs: {},
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '4':
   { type: 'tag',
     name: 'img',
     attribs:
      { alt: 'Elizabeth Arden White Tea Perfume',
        src:
         'https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dw489093d9/images/category-landing/white-tea_1100x1100.jpg',
        srcset:
         'https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dw489093d9/images/category-landing/white-tea_1100x1100.jpg' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'picture',
        attribs: {},
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '5':
   { type: 'tag',
     name: 'img',
     attribs:
      { alt: 'Skincare Diagnostic',
        src:
         'https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dw51ed6763/images/category-landing/red-door_1100x1100.jpg',
        srcset:
         'https://www.elizabetharden.com/on/demandware.static/-/Sites-ElizabethArden-Library/default/dw51ed6763/images/category-landing/red-door_1100x1100.jpg' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'picture',
        attribs: {},
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '6':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dwc531e5e7/images/2104_A0115075.jpg?sw=550&sh=550&sm=fit',
        alt: 'My Fifth Avenue Eau de Parfum, , large',
        class: 'desktop-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: null,
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '7':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dwc531e5e7/images/2104_A0115075.jpg?sw=550&sh=550&sm=fit',
        alt: 'My Fifth Avenue Eau de Parfum, , large',
        class: 'ipad-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '8':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dwc531e5e7/images/2104_A0115075.jpg?sw=135&sh=136&sm=fit',
        alt: 'My Fifth Avenue Eau de Parfum, , large',
        class: 'iphone-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '9':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dwbb9e72e0/images/1003A0106574.jpg?sw=550&sh=550&sm=fit',
        alt: 'Elizabeth Arden White Tea Eau de Toilette Spray, , large',
        class: 'desktop-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: null,
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '10':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dwbb9e72e0/images/1003A0106574.jpg?sw=550&sh=550&sm=fit',
        alt: 'Elizabeth Arden White Tea Eau de Toilette Spray, , large',
        class: 'ipad-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '11':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dwbb9e72e0/images/1003A0106574.jpg?sw=135&sh=136&sm=fit',
        alt: 'Elizabeth Arden White Tea Eau de Toilette Spray, , large',
        class: 'iphone-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '12':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dw55f80ff7/images/100326800.jpg?sw=550&sh=550&sm=fit',
        alt: 'Green Tea Scent Spray, , large',
        class: 'desktop-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: null,
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '13':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dw55f80ff7/images/100326800.jpg?sw=550&sh=550&sm=fit',
        alt: 'Green Tea Scent Spray, , large',
        class: 'ipad-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '14':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dw55f80ff7/images/100326800.jpg?sw=135&sh=136&sm=fit',
        alt: 'Green Tea Scent Spray, , large',
        class: 'iphone-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '15':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dw0dcf8cae/images/10034372400.jpg?sw=550&sh=550&sm=fit',
        alt: 'Green Tea Honey Drops Body Cream, , large',
        class: 'desktop-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: null,
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '16':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dw0dcf8cae/images/10034372400.jpg?sw=550&sh=550&sm=fit',
        alt: 'Green Tea Honey Drops Body Cream, , large',
        class: 'ipad-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '17':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dw0dcf8cae/images/10034372400.jpg?sw=135&sh=136&sm=fit',
        alt: 'Green Tea Honey Drops Body Cream, , large',
        class: 'iphone-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '18':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dwc687b1bb/images/2104-A0119537-Red-Door-Fragrance-3.3oz-4-Piece-Set.jpg?sw=550&sh=550&sm=fit',
        alt: 'Red Door 3.3oz Eau De Toilette 4-Piece Set, , large',
        class: 'desktop-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: null,
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '19':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dwc687b1bb/images/2104-A0119537-Red-Door-Fragrance-3.3oz-4-Piece-Set.jpg?sw=550&sh=550&sm=fit',
        alt: 'Red Door 3.3oz Eau De Toilette 4-Piece Set, , large',
        class: 'ipad-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '20':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dwc687b1bb/images/2104-A0119537-Red-Door-Fragrance-3.3oz-4-Piece-Set.jpg?sw=135&sh=136&sm=fit',
        alt: 'Red Door 3.3oz Eau De Toilette 4-Piece Set, , large',
        class: 'iphone-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '21':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dw86b39b0f/images/2104_Pomegranate.jpg?sw=550&sh=550&sm=fit',
        alt: 'Green Tea Pomegranate  Eau De Toilette Spray, , large',
        class: 'desktop-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: null,
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '22':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dw86b39b0f/images/2104_Pomegranate.jpg?sw=550&sh=550&sm=fit',
        alt: 'Green Tea Pomegranate  Eau De Toilette Spray, , large',
        class: 'ipad-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: [Object],
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  '23':
   { type: 'tag',
     name: 'img',
     attribs:
      { src:
         'https://www.elizabetharden.com/dw/image/v2/AAHP_PRD/on/demandware.static/-/Sites-elizabetharden-master-catalog/default/dw86b39b0f/images/2104_Pomegranate.jpg?sw=135&sh=136&sm=fit',
        alt: 'Green Tea Pomegranate  Eau De Toilette Spray, , large',
        class: 'iphone-only' },
     children: [],
     next:
      { data: '\n',
        type: 'text',
        next: null,
        prev: [Circular],
        parent: [Object] },
     prev:
      { data: '\n',
        type: 'text',
        next: [Circular],
        prev: [Object],
        parent: [Object] },
     parent:
      { type: 'tag',
        name: 'a',
        attribs: [Object],
        children: [Array],
        next: [Object],
        prev: [Object],
        parent: [Object] } },
  options:
   { normalizeWhitespace: false,
     xmlMode: false,
     decodeEntities: true,
     withDomLvl1: true },
  _root:
   initialize {
     '0':
      { type: 'root',
        name: 'root',
        attribs: {},
        children: [Array],
        next: null,
        prev: null,
        parent: null },
     options:
      { normalizeWhitespace: false,
        xmlMode: false,
        decodeEntities: true,
        withDomLvl1: true },
     length: 1,
     _root: [Circular] },
  length: 24,
  prevObject:
   initialize {
     '0':
      { type: 'root',
        name: 'root',
        attribs: {},
        children: [Array],
        next: null,
        prev: null,
        parent: null },
     options:
      { normalizeWhitespace: false,
        xmlMode: false,
        decodeEntities: true,
        withDomLvl1: true },
     length: 1,
     _root: [Circular] } }
var initialize = {
      '0': {   
         type: 'tag',
         name: 'img',
         attribs: { 
            src: 'path/to/file.png',
            alt: 'SEO is good' 
         },
       },
      '1': { 
         type: 'tag',
         name: 'img',
         attribs: { 
             src: 'path/to/another/image.jpg',
            alt: 'SEO is GREAT' 

         }
       }

У меня есть объект, и я хочу рекурсивно проходить по нему, пока не доберусь до своего свойства и значения, которое я буду sh.

Не вот как бы вы это сделали?

function iterObj(obj) {
  var arr = []
  arr.push(obj)
  return arr.map(obj => {
    var newObj = {}
    if (obj !== null && typeof obj === "object") {
      iterObj(obj);
    }
    newObj[obj.src] = obj.src;
    return newObj;
  })
}

Так что не iterObj(initialize) доходность:

[{src: 'path/to/file.png'}, {src: 'path/to/another/image.jpg'}]

ОБНОВЛЕНИЕ:

Может помочь чтобы включить контекст, где я использую это:

Ниже приведен модуль скребка, который я использую в узле.

var Crawler = require("crawler");
const fs = require('fs');

function IsJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}

function iterObj(obj) {
    var arr = []
    var isNotNull = (value) => typeof value !== "object" && value !== null

    for (var value of Object.values(obj)) {
        console.log("value line 18", value);

        if (value !== null) {
            if (value.src) { arr.push({ src: value.src }) }
            if (typeof value === "object" && !Array.isArray(value)) {
                console.log("value line 23", value);

                arr.push(...iterObj(value));
            }
        }
    }
    return arr;
}



var c = new Crawler({
    maxConnections: 10,
    // This will be called for each crawled page
    callback: function(error, res, done) {
        if (error) {
            console.log(error);
        } else {
            var $ = res.$;
            // $ is Cheerio by default
            //a lean implementation of core jQuery designed specifically for the server;
            var img = $(`img`);
            fs.writeFile('fragrance.js', img, (err) => {
                if (err) throw err;
                console.log(`img`, img);
                console.log(`iterObj(obj) ${iterObj(img)}`)
                    // console.log(`IsJsonString(img)`, IsJsonString(img[0]));


                console.log('Data written to file.')
            })

        }
        done();
    }
});

c.queue('https://www.somesite.com/someendpoint/')

1 Ответ

1 голос
/ 23 января 2020

Чтобы проверить каждое свойство объекта, вам необходимо получить список свойств объекта и / или их соответствующих значений, используя Object.keys(), Object.values() или Object.entries(). Оттуда вам нужно будет проверить, соответствует ли каждое значение следующим критериям:

1) Если оно имеет свойство sr c, pu sh это свойство и продолжить на

2 ) Если это объект, а не нуль, выполните рекурсивный просмотр объекта, чтобы проверить, есть ли у него или его дочерних элементов свойство sr c

. Затем вы объединяете результаты рекурсивных вызовов в исходный массив и вернуть окончательные результаты. Это один из ключевых моментов, которые вам не хватало. Вы делали рекурсивные вызовы, но ничего не делали с ними.

Причина, по которой вы не можете использовать .map, как вы это делали, заключается в том, что вы не возвращаете sr c от объекта 1-к-1. Объект может содержать любое количество дочерних свойств sr c, или он может содержать 0. Вместо этого вам нужно будет создать свой список результатов вручную.

Вот рабочий пример того, что вы пытаетесь сделать :

var initialize = {
  '0': {   
      type: 'tag',
      name: 'img',
      attribs: { 
        src: 'path/to/file.png',
        alt: 'SEO is good',
        self: null,
        parent: null,
        top: null
      },
      next: {
        prev: null
      },
      prev: {
        next: null
      }
    },
  '1': { 
      type: 'tag',
      name: 'img',
      attribs: { 
          src: 'path/to/another/image.jpg',
        alt: 'SEO is GREAT' 

      }
    }
}

// add circular references for testing
initialize[0].attribs.self = initialize[0].attribs;
initialize[0].attribs.parent = initialize[0];
initialize[0].attribs.top = initialize;
initialize[0].next.prev = initialize[0].prev;
initialize[0].prev.next = initialize[0].next;

function iterObj(nestedObj) {
  // keep a list of object references to prevent circular references at any level
  let objReferences = [];
  function rHelper(obj) {
    let arr = []
    let objValues = Object.values(obj);
    // use var to avoid additonal heap overhead of new variable for each iteration
    for (var i = 0; i < objValues.length; i++) {
      let val = objValues[i];
      // check if non null and not a reference we've already seen before (AKA circular reference)
      if (val !== null && objReferences.indexOf(val) === -1) {
        if (val.src) { arr.push({ src: val.src }) }
        if (typeof val === "object" && !Array.isArray(val)) {
          // since we're checking this object, add reference to list to make sure it doesn't get
          // referenced by any of its children or siblings
          objReferences.push(val);
          arr.push(...rHelper(val));
        }
      }
    }
    return arr;
  }

  return rHelper(nestedObj);
}

console.log(iterObj(initialize));
...