在 underscore.js 中更改地图的结果

Alter result for map in underscore.js

因为 map 将 return "undefined" 用于不匹配的元素,什么是 return 只有匹配的元素的最佳方法?

let items: string[] = ["false", "false", "true"];

let newItems: string[] = _.map(items, function(item) {
  if (item === "true") {
    return "newItem";
  }
});

console.log(newItems);
// newItems = [undefined,undefined,"newItem"];

let filterItems: string[] = _.filter(items, function(item) {
  if (item === "true") {
    return "newItem";
  }
});

console.log(filterItems);
// filterItems = ["true"]
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

我可以使用 _.filter,但是过滤器会 return "true" 的值而不是 "newItem",因为我需要它。

有什么建议吗?

你应该 filter 然后 map,这样你只调用 map 匹配的项目

let newItems: string[] = _.map(
   _.filter(items, function(item) {
      return item === "true";
   }),
   function(newItem) {
      return "newItem";
   }
);

同时使用地图和过滤器:

collection.filter(it => it === 'true').map(it => 'newItem');

当你不能 map 一个值时返回 undefined 没有错,但你不想在最终结果中出现这些值,所以只 filter 然后输出。

您对 filter 返回布尔值而不是转换后的值的担忧正是过滤器的工作原理。它 returns 通过测试函数的原始值,因此您可以在子集上映射(或任何其他函数操作)。

您可以使用 reduce 同时进行两个操作:

let items: string[] = ["false", "false", "true"];

let newItems: string[] = _.reduce(items, function(memo, item) {
  if (item === "true") {
    memo.push("newItem");
  }
  return memo;
}, []);

let items = ["false", "false", "true"];

let newItems = _.reduce(items, function(memo, item) {
  if (item === "true") {
    memo.push("newItem");
  }
  return memo;
}, []);

console.log(newItems);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>