使用地图过滤并在es6中返回新对象

时间:2019-10-17 18:34:08

标签: 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];
        }

      });

效果很好。但是,我想使用就地更新方法。所以我选择了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 };
    }

  });

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

2 个答案:

答案 0 :(得分:3)

filter()之后使用map()来过滤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);

或使用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;
}, []);

答案 1 :(得分:0)

您可以使用.reduce

例如:

[1,2,3,4].reduce((acc,n)=>{
    if (n % 2 == 0) {
        acc.push(n*4)
    }
    return acc;
},[])

这将产生一个偶数* 4的列表,或者组合.filter.map