【问题标题】:Do JavaScript arrays have a chainable method similar to forEach?JavaScript 数组是否有类似于 forEach 的可链接方法?
【发布时间】:2014-06-24 15:16:37
【问题描述】:

在一系列数组操作方法中,我想更改数组中每个项目的属性。

以这种方式使用时,每个可用的方法都会出现问题:

  • Array.prototype.forEach 不返回数组
  • Array.prototype.map 要求返回每一项
  • Array.prototype.filter 要求为每个项目返回一个“真”值

Array 是否有一个方法可以操作数组中的每一项,并返回该数组?

我已经使用了mapfilter,但这感觉像是一种没有必要的解决方法。

一个人为的例子:

var items = [
   { name: 'Smith' }, 
   { name: 'Jones' }, 
   { name: 'Simpson' }
];

过滤器:

return items.filter(function(item) {
   item.fullname = 'Professor ' + item.name;
   return true;
});

地图:

return items.map(function(item) {
   item.fullname = 'Professor ' + item.name;
   return item;
});

forEach:

items.forEach(function(item) {
   item.fullname = 'Professor ' + item.name;
});

return items;

??:

return items.someMethod(function(item) {
   item.fullname = 'Professor ' + item.name;
});

【问题讨论】:

  • forEach 在这里可能是最正确的,因为它说“对于每个项目,将其 fullname 属性设置为 'Professor' name”。
  • 一般来说,链接东西通常意味着你试图一次做太多事情。在我看来,无论如何。
  • 既然你想要一个方法“允许数组中的每一项都被操作,并返回数组?”map 不是显而易见的吗?还是我不确定问题出在哪里?
  • Array.prototype.each = function(){ this.forEach.apply(this, arguments); return this; }; 可能会
  • "item.fullname = '教授' + item.name;"并不比“return item.fullname = 'Professor' + item.name, 1;”短很多,这让你更容易“滥用”过滤器......

标签: javascript arrays


【解决方案1】:

不,没有这样的方法。不过,常见的帮助程序库(UnderscorejQueryPrototype、...)确实具有返回数组的 each 迭代方法。

forEach 方法不返回原始数组,因为它不是为函数链接而设计的,而是用于执行副作用。

map 方法是这里选择的工具。它来自函数式编程,其目的是创建一个 new 转换对象数组,该数组自然是从函数返回的。通过改变你的对象而不是创建新的对象,你忽略了这个范例,但是当你 return (突变的)对象时你仍然可以使用它。

【讨论】:

【解决方案2】:

你考虑过reduce吗?

The reduce() method applies a function against an accumulator and each value of the array (from left-to-right) has to reduce it to a single value.

var items = [
   { name: 'Smith' }, 
   { name: 'Jones' }, 
   { name: 'Simpson' }
];

items.reduce(function (memo, item) {

    item = 'Sir ' + item + ', the first.';

    if (somePredicate(item)) {
        memo.push(item);
    }

    return memo;

}, []);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2011-03-27
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多