遍历在nodeJs中具有嵌套对象的对象
Iterate through an object which has nested objects in nodeJs
我有一个包含多个嵌套对象的 javascript 对象,如下所示:
var stats = {
bookServed: {
redis: 90,
s3: 90,
signedUrl: 70
},
errors: {
redis: {
bookService: 70,
mapi: 50,
capi: 30
},
AWS: {
signedUrl: 70,
downloadBook: 50,
searchBook: 10
},
decryption: 60
}
};
迭代所有属性并将每个值设置为 0
的最简洁方法是什么。我写了这样的东西
for (var property in stats) {
if (stats.hasOwnProperty(property)) {
if (typeof property === "object") {
for (var sub_property in property)
if (property.hasOwnProperty(sub_property)) {
sub_property = 0
}
} else {
property = 0;
}
}
}
我愿意使用 underscore.js 这样的库来正确完成任务。
相对简单的递归问题,我会使用一个在找到子对象时调用自身的函数。我也会避免使用 for in 循环,而是在对象的键上使用 forEach(它更快,并且不需要 hasOwnProperty 检查。)
function resetValuesToZero (obj) {
Object.keys(obj).forEach(function (key) {
if (typeof obj[key] === 'object') {
return resetValuesToZero(obj[key]);
}
obj[key] = 0;
});
}
var stats = {
bookServed: {
redis: 90,
s3: 90,
signedUrl: 70
},
errors: {
redis: {
bookService: 70,
mapi: 50,
capi: 30
},
AWS: {
signedUrl: 70,
downloadBook: 50,
searchBook: 10
},
decryption: 60
}
};
console.log(stats.errors.AWS.signedUrl); // 70
resetValuesToZero(stats);
console.log(stats.errors.AWS.signedUrl); // 0
下面的解决方案使用 object-scan,它使用迭代实现来遍历输入。另请注意,这将遍历任何类似于已接受答案的数组结构。
// const objectScan = require('object-scan');
const rewriter = objectScan(['**'], {
rtn: 'count',
filterFn: ({ value, parent, property }) => {
if (typeof value === 'number') {
parent[property] = 0;
return true;
}
return false;
}
});
const stats = { bookServed: { redis: 90, s3: 90, signedUrl: 70 }, errors: { redis: { bookService: 70, mapi: 50, capi: 30 }, AWS: { signedUrl: 70, downloadBook: 50, searchBook: 10 }, decryption: 60 } };
console.log(rewriter(stats)); // returns count of replaces
// => 10
console.log(stats);
/* =>
{ bookServed: { redis: 0, s3: 0, signedUrl: 0 },
errors:
{ redis: { bookService: 0, mapi: 0, capi: 0 },
AWS: { signedUrl: 0, downloadBook: 0, searchBook: 0 },
decryption: 0 } }
*/
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.8.0"></script>
免责声明:我是object-scan
的作者
function checkNPE(obj) {
for(const name in obj){console.log('name: ' + JSON.stringify(name, null, 4));
if (typeof obj[name] === 'object') {console.log('object name: ' + JSON.stringify(name, null, 4));
checkNPE(obj[name]);
} // if (typeof obj[name] === 'object') {
} // for(const name in obj){
}; // function checkNPE (obj) {
var stats = {
bookServed: {
redis: 90,
s3: 90,
signedUrl: 70
},
errors: {
redis: {
bookService: 70,
mapi: 50,
capi: 30
},
AWS: {
signedUrl: 70,
downloadBook: 'a',
searchBook: 10
},
decryption: 60
}
};
checkNPE(stats);
我有一个包含多个嵌套对象的 javascript 对象,如下所示:
var stats = {
bookServed: {
redis: 90,
s3: 90,
signedUrl: 70
},
errors: {
redis: {
bookService: 70,
mapi: 50,
capi: 30
},
AWS: {
signedUrl: 70,
downloadBook: 50,
searchBook: 10
},
decryption: 60
}
};
迭代所有属性并将每个值设置为 0
的最简洁方法是什么。我写了这样的东西
for (var property in stats) {
if (stats.hasOwnProperty(property)) {
if (typeof property === "object") {
for (var sub_property in property)
if (property.hasOwnProperty(sub_property)) {
sub_property = 0
}
} else {
property = 0;
}
}
}
我愿意使用 underscore.js 这样的库来正确完成任务。
相对简单的递归问题,我会使用一个在找到子对象时调用自身的函数。我也会避免使用 for in 循环,而是在对象的键上使用 forEach(它更快,并且不需要 hasOwnProperty 检查。)
function resetValuesToZero (obj) {
Object.keys(obj).forEach(function (key) {
if (typeof obj[key] === 'object') {
return resetValuesToZero(obj[key]);
}
obj[key] = 0;
});
}
var stats = {
bookServed: {
redis: 90,
s3: 90,
signedUrl: 70
},
errors: {
redis: {
bookService: 70,
mapi: 50,
capi: 30
},
AWS: {
signedUrl: 70,
downloadBook: 50,
searchBook: 10
},
decryption: 60
}
};
console.log(stats.errors.AWS.signedUrl); // 70
resetValuesToZero(stats);
console.log(stats.errors.AWS.signedUrl); // 0
下面的解决方案使用 object-scan,它使用迭代实现来遍历输入。另请注意,这将遍历任何类似于已接受答案的数组结构。
// const objectScan = require('object-scan');
const rewriter = objectScan(['**'], {
rtn: 'count',
filterFn: ({ value, parent, property }) => {
if (typeof value === 'number') {
parent[property] = 0;
return true;
}
return false;
}
});
const stats = { bookServed: { redis: 90, s3: 90, signedUrl: 70 }, errors: { redis: { bookService: 70, mapi: 50, capi: 30 }, AWS: { signedUrl: 70, downloadBook: 50, searchBook: 10 }, decryption: 60 } };
console.log(rewriter(stats)); // returns count of replaces
// => 10
console.log(stats);
/* =>
{ bookServed: { redis: 0, s3: 0, signedUrl: 0 },
errors:
{ redis: { bookService: 0, mapi: 0, capi: 0 },
AWS: { signedUrl: 0, downloadBook: 0, searchBook: 0 },
decryption: 0 } }
*/
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.8.0"></script>
免责声明:我是object-scan
的作者function checkNPE(obj) {
for(const name in obj){console.log('name: ' + JSON.stringify(name, null, 4));
if (typeof obj[name] === 'object') {console.log('object name: ' + JSON.stringify(name, null, 4));
checkNPE(obj[name]);
} // if (typeof obj[name] === 'object') {
} // for(const name in obj){
}; // function checkNPE (obj) {
var stats = {
bookServed: {
redis: 90,
s3: 90,
signedUrl: 70
},
errors: {
redis: {
bookService: 70,
mapi: 50,
capi: 30
},
AWS: {
signedUrl: 70,
downloadBook: 'a',
searchBook: 10
},
decryption: 60
}
};
checkNPE(stats);