我需要将两个集合与大量嵌套对象和数组进行比较。这是文档的结构
这是我的代码
function iterate_array (my_array, path, cur_id) {
for(item in my_array) {
if (item == "cloudTimestamp") {
continue;
} else if (typeof my_array[item] == "object") {
var x = path.slice();
x.push(item);
iterate_array(my_array[item], x, cur_id);
} else if (typeof my_array[item] == "function") {
continue;
} else {
other_val = otherdb.product.findOne({"_id" : cur_id});
if (path == '') {
if (my_array[item] == other_val[item]) {
print("field matched");
} else {
print("field NOT matched");
}
} else {
var string_path = JSON.stringify(path).replace(/[^A-Za-z0-9,]/g, '').replace(/,/g, '.');
if (my_array[item] == other_val[string_path][item]) {
print("field matched");
} else {
print("field NOT matched");
}
}
}
}
}
var db = db.getSiblingDB('smcdb_bos_new');
var otherdb = db.getSiblingDB('smcdb_boa_new');
var cursor = db.product.find();
cursor.forEach( function (mydoc) {
iterate_array(mydoc, [], mydoc['_id']);
});
脚本一直有效,直到达到XrefHistory.values数组。然后它崩溃并出现以下错误:
2016-01-19T07:15:38.566-0500 TypeError: Cannot read property '0' of undefined at compare.js:22
答案 0 :(得分:0)
您的代码中存在错误:
var string_path = JSON.stringify(path).replace(/[^A-Za-z0-9,]/g, '').replace(/,/g, '.');
if (my_array[item] == other_val[string_path][item]){
...
} else
{
}
您正尝试使用string_path
other_val
来访问数据,但这不会起作用。您要做的是other_val['a.b.c']
,其实际上应该是other_val['a']['b']['c']
或other_val.a.b.c.
。因此找不到密钥,因此从undefined中读取0。