**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'
}
}
I have an object and want to traverse recursively until I get to my property and value I wish.
Isn't this how you would do it ?
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;
})
}
So shouldn't iterObj(initialize)
yield:
[{src: 'path/to/file.png'}, {src: 'path/to/another/image.jpg'}]
UPDATE:
Might help to include the context where I am using this:
Below is a scraper module I am using in node.
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/')