【问题标题】:Removing an item when using Array.prototype.map() in Javascript在 Javascript 中使用 Array.prototype.map() 时删除项目
【发布时间】:2018-04-01 15:58:54
【问题描述】:

我目前有一个包含数字数组的变量

let numbersArray = [12, 15, 19, 20];

当循环遍历它时,如果它是某个值,我想删除该条目

let numbersArray = [12,15,19,20],
    filteredNumbersArray = numbersArray.map(function(value)
    {
        if(value === 15)
        {
            //delete the value
        } else {
            return value * 2;
        }
    });

关于使用.filter(),值必须是可变的,我已经更新了例子

我搜索了MDN,但找不到任何关于删除map() 中的元素的信息。

橡皮鸭也没有用

【问题讨论】:

  • Array#filter 可以删除一个项目,Array#map 为每个项目返回一个值。
  • 你需要的是过滤而不是映射
  • @NinaScholz 啊,我明白了,我似乎错过了我认为不需要的问题中的一个细节,我也需要价值操作。

标签: javascript arrays


【解决方案1】:

你可以过滤然后映射

var array = [12, 15, 19, 20],
    result = array
        .filter(v => v !== 15)
        .map(v => 2 * v);
        
console.log(result);

或者使用所有数组操作的瑞士刀:Array#reduce

var array = [12, 15, 19, 20],
    result = array.reduce((r, v) => v !== 15 ? r.concat(v): r, []);
        
console.log(result);

经过一些优化

var array = [12, 15, 19, 20],
    result = array.reduce(function (r, v) {
        if (v !== 15) {
            r.push(2 * v);
        }
        return r;
    }, []);
        
console.log(result);

【讨论】:

  • 我从未见过reduce(),这是一种非常巧妙的做法,谢谢!
  • @Ian:如上所述,为每次迭代创建一个全新的数组,这也是非常低效的。如果您想为此使用reduce(它不会让您获得任何好处,只会降低清晰度),那么:filtered = original.reduce((r, v) => { if (v !== 15) { r.push(v); } return r; }, []); 所以它不会每次都复制数组。
  • 感谢@T.J.Crowder 的提醒
【解决方案2】:

map 无法删除值。如果您需要同时map filter,您的选择是:

  1. filter,然后是map,例如:

    filteredNumbersArray = numbersArray.filter(function(v) { return v !== 15; })
                                       .map(function(v) { return v * 2; });
    

    或使用 ES2015+ 语法:

    filteredNumbersArray = numbersArray.filter(v => v !== 15)
                                       .map(v => v * 2);
    

  2. 写你自己的东西,大概:

    filteredNumbersArray = [];
    numbersArray.forEach(function(v) {
        if (v !== 15) {
            filteredNumbersArray.push(v * 2);
        }
    });
    

    或使用 ES2015+ 语法:

    filteredNumbersArray = [];
    for (const v of numbersArray) {
        if (v !== 15) {
            filteredNumbersArray.push(v * 2);
        }
    }
    

    (您也可以在此处 [ab] 使用 reduce,但它不会为您带来任何值得拥有的东西,而且会花费清晰性。)

    如果它对你来说很多,给自己一个组合的map-and-filter 函数,它使用一些特殊的返回值来指示应该删除条目。

【讨论】:

    【解决方案3】:

    Map 不会删除值,它只会改变它们。 您可以将该值设置为 null,但这可能不是您的意图。

    过滤器可能会更好地为您服务
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

    let numbersArray = [12,15,19,20],
    filteredNumbersArray = numbersArray.filter(function(value)
    {
        return value != 15
    });
    

    这将返回一个没有数字 15 的数组。

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 2021-09-14
      • 2013-12-03
      • 1970-01-01
      • 2015-04-14
      • 2014-04-28
      相关资源
      最近更新 更多