【问题标题】:How to map through a object array while it is uncertain if all fields in the object exist?在不确定对象中的所有字段是否都存在的情况下,如何映射对象数组?
【发布时间】:2018-03-30 16:18:54
【问题描述】:

我需要从包含许多(嵌套)对象的数组中获取单个对象值并将这些值保存在新数组中。这适用于以下地图:

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"];

或者是否有其他解决方案?

【问题讨论】:

  • 这肯定有一个欺骗目标,但我没有找到一个干净的...

标签: javascript arrays database object if-statement


【解决方案1】:

您可以使用&& 守卫:

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 存在(并且不是假的),则结果将是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));

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2011-01-07
    • 1970-01-01
    • 2011-03-05
    • 2020-09-18
    • 2020-10-27
    相关资源
    最近更新 更多