function findObjectByLabel(haystack, needle, buffer = []) {
if (typeof haystack === 'object') {
for (const prop in haystack) {
const result = prop === needle ? [haystack] : findObjectByLabel(haystack[prop], needle);
if (result.length > 0) {
buffer = buffer.concat(result);
}
}
}
return buffer;
}
// Unit test
function test_findObjectByLabel() {
const obj = {
foo: {
foo1: {
item1: 'item1',
item2: 'item2',
item3: 'item3',
},
foo2: {
item1: 'item1',
item2: 'item2',
item3: 'item3',
subFoo: {
item1: 'item1',
item2: 'item2',
needle: 'needle',
}
}
},
bar: {
bar1: {
item1: 'item1',
item2: 'item2',
item3: 'item3',
},
bar2: {
item1: 'item1',
item2: 'item2',
item3: 'item3',
needle: 'needle',
}
},
}
const expected = [
obj.foo.foo2.subFoo, // <-- contain "needle"
obj.bar.bar2, // <-- contain "needle"
];
const actual = findObjectByLabel(obj, 'needle');
if (JSON.stringify(actual) === JSON.stringify(expected)) {
console.log('Pass');
console.log('expected => ', JSON.stringify(expected, null, 4));
console.log('actual => ', JSON.stringify(actual, null, 4));
} else {
console.log('Fail');
console.log('Actual')
console.log(JSON.stringify(actual));
console.log('is not equal to expected');
console.log(JSON.stringify(expected));
}
}
test_findObjectByLabel();