面试题答案
一键面试function (doc) {
if (doc.main_data && doc.main_data.sub_section1) {
emit(null, doc.main_data.sub_section1.data1);
}
if (doc.main_data && doc.main_data.sub_section2) {
doc.main_data.sub_section2.forEach(function(subSubDoc) {
var key = Object.keys(subSubDoc)[0];
var value = subSubDoc[key];
emit(null, {[key]: value});
});
}
}
说明
if (doc.main_data && doc.main_data.sub_section1)
:- 先判断
doc
对象中存在main_data
属性,并且main_data
属性中存在sub_section1
属性。这一步是为了界定数据提取范围,保证在访问sub_section1
的data1
字段时不会因为sub_section1
不存在而报错。
- 先判断
emit(null, doc.main_data.sub_section1.data1);
:- 如果上述条件满足,就将
sub_section1
中的data1
字段的值通过emit
函数输出。null
作为键,这里键的选择可以根据后续Reduce函数的需求进行调整,如果没有Reduce操作,使用null
是一种简单的标识方式。
- 如果上述条件满足,就将
if (doc.main_data && doc.main_data.sub_section2)
:- 同样先判断
doc
对象中存在main_data
属性,并且main_data
属性中存在sub_section2
属性。这一步也是为了界定数据提取范围,确保后续对sub_section2
数组的操作是安全的。
- 同样先判断
doc.main_data.sub_section2.forEach(...)
:- 对
sub_section2
数组中的每个对象进行遍历。
- 对
var key = Object.keys(subSubDoc)[0];
:- 获取当前遍历到的对象的第一个键。
var value = subSubDoc[key];
:- 根据获取到的键,获取对应的值。
emit(null, {[key]: value});
:- 将键值对通过
emit
函数输出,同样以null
作为键。这样就准确提取了sub_section2
数组中每个对象的第一个键值对。
- 将键值对通过