es6中使用map过滤并返回一个新对象

Lea*_*ner 2 javascript ecmascript-6

我有以下代码:

      allDesignDocs.rows.forEach((row: any) => {
        if (!designDocsName.includes(row.id.replace("_design/", ""))) {
          toBeRemoved = [{ _id: row.id, _rev: row.value.rev, "_deleted": true }, ...toBeRemoved];
        }

      });
Run Code Online (Sandbox Code Playgroud)

效果很好。不过我想使用就地更新方法。所以我选择了map而不是foreach:

  var test = allDesignDocs.rows.map((row: any) => {
    if (!designDocsName.includes(row.id.replace("_design/", ""))) {
      return { _id: row.id, _rev: row.value.rev, "_deleted": true };
    }

  });
Run Code Online (Sandbox Code Playgroud)

因此,当条件不满足时,上面会返回包含 undefined 的数组。我只希望数组包含从 if 内部返回的值并忽略所有未定义的值。我知道我可以循环遍历结果并清理它,但这不是一个干净的方法。es6有没有函数可以提供上述功能?

Nik*_*hil 5

在map()之后使用filter()来过滤值。undefined

var test = allDesignDocs.rows.map((row: any) => {
   if (!designDocsName.includes(row.id.replace("_design/", ""))) {
     return { _id: row.id, _rev: row.value.rev, "_deleted": true };
   }
 }).filter(item => item !== undefined); // Can also use filter(item => item);
Run Code Online (Sandbox Code Playgroud)

或者使用reduce()

var test = allDesignDocs.rows.reduce((acc, row: any) => {
  if (!designDocsName.includes(row.id.replace("_design/", ""))) {
    acc.push({ _id: row.id, _rev: row.value.rev, "_deleted": true });
  }
  return acc;
}, []);
Run Code Online (Sandbox Code Playgroud)