我需要从一个包含许多(嵌套的)对象的数组中获取单个对象值,并将这些值保存在一个新的数组中。这可以很好地与map配合使用,如下所示:
var newArrayA = array.map(x => x.PI[0].ZZ);
var newArrayB = array.map(x => x.FS.CC.FR);
var newArrayC = array.map(x => x.FS.BD.FR);在所有对象都包含所有值的情况下,如下所示:
var array =
[
{ _id: 'MEuDZjQDw8XQk4ny7Y',
PI: [
{ZZ: "ABC"}
],
FS:
{ CC: {FR: 1},
BD: {FR: 2}
}
},
{ _id: 'gFsya9tHMAkAoPgvw',
PI: [
{ZZ: "DEF"}
],
FS:
{ CC: {FR: 3},
BD: {FR: 4}
}
}
]在数组的数据结构中可能有更多的'id‘对象以及更多的字段。但是,如果第二个对象不包含FS字段,我会收到一个错误:
var array =
[
{ _id: 'MEuDZjQDw8XQk4ny7Y',
PI: [
{ZZ: "ABC"}
],
FS:
{ CC: {FR: 1},
BD: {FR: 2}
}
},
{ _id: 'gFsya9tHMAkAoPgvw',
PI: [
{ZZ: "DEF"}
]
}
]问题是我仍然需要从包含这些值的对象中获取FS.CC或FS.BD值。如果值不在对象中,则得到“空”或“未定义”,如果值在对象中,则完全没有问题:
var neededNewArrayC = [2, "empty"];或者有没有别的解决方案?
发布于 2018-03-31 00:22:45
您可以使用&&防护:
var newArrayB = array.map(x => x.FS && x.FS.CC && x.FS.CC.FR);
// ----------------------------^^^^^^^^^^^^^^^^^^^如果x不包含FS,则x.FS将为undefined,并且&&表达式将使用undefined作为其值。x.FS.CC也是如此。但是如果x.FS.CC存在(并且不是falsy),结果将是x.FS.CC.FR的值。
示例:
var a = [
{ // Has everything
FS: {
CC: {
FR: "the FR value"
}
}
},
{ // No .FS.CC
FS: {
}
},
{ // No .FS
}
];
console.log(a.map(x => x.FS && x.FS.CC && x.FS.CC.FR));
https://stackoverflow.com/questions/49577764
复制相似问题