lodash .each 和 .trim 忽略数组元素?

lodash .each and .trim ignoring array elements?

我正在尝试组合一些演示 lodash 功能,但我 运行 遇到了一些奇怪的行为。

我有一个汽车数组,加上一些其他的非字符串元素。我想取出数组的每个元素并将其从汽车数组中删除,检查它是否是一个字符串,如果是,trim 关闭任何尾随白色 space,添加一个 's' 并将其推入 pluralCars 数组。

我在 angular 控制器中执行此操作并在视图中打印数组。

vm.cars = ['Saab ', 'Volvo', 'BMW ', 'Ford', 'Chevrolet ', 'Toyota', 'Honda', 'BMW', 45, true, false, null];
vm.pluralCars = [];

lodash.each(vm.cars, function(car) {
  if (lodash.isString(car)) {
    lodash.pull(vm.cars, car);
    lodash.trim(car);
    car = car + 's';
    vm.pluralCars.push(car);
  }
 });

{{cars}}的输出是:

["Volvo","Ford","Toyota","BMW",45,true,false,null]

`{{pluralCars}}' 的输出是:

["Saab s","BMW s","Chevrolet s","Hondas"]

请注意,沃尔沃、福特、丰田和宝马(w/o 尾随的白色 space)没有从 cars 数组中提取、复数化并添加到 pluralCars 数组中。

然后被拉的琴弦没有白色space trimmed。

字符串是不可变的,无法更改。

_.trim 做 return 一个 new 字符串,但你只是扔掉了那个结果。您需要使用

car = lodash.trim(car);

除此之外,您似乎应该将代码简化为

vm.pluralCars = lodash.map(lodash.filter(vm.cars, lodash.isString), function(car) {
  return lodash.trim(car) + 's';
});

没有任何 _.pulling - 你不想修改 vm.cars,你当然不想在迭代它时删除项目,因为这会导致跳过一些。如果您也在寻找非字符串值的数组,您可以使用 _.partition 而不是过滤器。