【问题标题】:Replace in array using lodash使用 lodash 在数组中替换
【发布时间】:2013-11-08 13:17:14
【问题描述】:

有没有一种简单的方法可以将数组中一个基元的所有外观替换为另一个。这样['a', 'b', 'a', 'c'] 将在将a 替换为x 时变为['x', 'b', 'x', 'c']。我知道这可以通过 map 函数来完成,但我想知道是否忽略了一种更简单的方法。

【问题讨论】:

  • 我认为像 Lo-Dash 这样的库的目的不是让你写出你能写出的最符合代码的解决方案,而是写出最自然、最惯用的解决方案。在这种情况下,还有什么比 map() 更自然和惯用的呢?这是完成这项工作的完美工具。
  • @Tomalak _(array).filter('someKey').replace('a', 'x') 在我看来很自然
  • 但这不合逻辑——我希望名为“filter”的操作可以减少输入中的元素数量。另外:这与外观无关。这是关于您要对数据执行的 操作,对我来说,这是“映射 N 个值的列表和 N 个值的列表(其中一些偶然恰好与输入相同) )"。
  • 使用 Lodash 中的 findIndex 然后替换找到的索引处的元素

标签: javascript underscore.js lodash


【解决方案1】:

在您的示例所具有的字符串的 特定 情况下,您可以使用以下方式进行本机操作:

myArr.join(",").replace(/a/g,"x").split(",");

其中“,”是一些没有出现在数组中的字符串。

也就是说,我没有看到 _.map 的问题 - 这听起来像是更好的方法,因为这实际上是您正在做的事情。您正在将数组映射到自身并替换值。

_.map(myArr,function(el){
     return (el==='a') ? 'x' : el;
})

【讨论】:

  • 问题是关于原语而不仅仅是字符串。我还想使用 lodash,因为这将是更长链中的一个步骤,在其中操作数组数据。
  • @AndreasKöberle 首先,使用特定库是一种手段,而不是目标。其次 - 在这种情况下,_.map 就是您要查找的内容,下划线/lodash 在集合上没有特定的替换/交换功能,如果您愿意,您可以自己将其添加到 lodash 原型中。
  • _.map 真的很适合这个用例,不需要寻找其他任何东西。
【解决方案2】:

我不知道“更简单”,但你可以让它可重复使用

function swap(ref, replacement, input) {
    return (ref === input) ? replacement : input;
}

var a = ['a', 'b', 'a', 'c'];

_.map(a, _.partial(swap, 'a', 'x'));

【讨论】:

    【解决方案3】:

    如果数组包含可变对象,使用 lodash 的 find 函数很简单。

      var arr = [{'a':'a'}, {'b':'b'},{'a':'a'},{'c':'c'}];    
    
      while(_.find(arr, {'a':'a'})){
        (_.find(arr, {'a':'a'})).a = 'x';
      }
    
    
    console.log(arr); // [{'a':'x'}, {'b':'b'},{'a':'x'},{'c':'c'}]
    

    【讨论】:

      【解决方案4】:

      另一个简单的解决方案。适用于字符串数组,替换所有出现的地方,读取良好。

      var arr1 = ['a', 'b', 'a', 'c'];
      var arr2 = _.map(arr1, _.partial(_.replace, _, 'a', 'd'));
      console.log(arr2); // ["d", "b", "d", "c"]
      

      【讨论】:

        猜你喜欢
        • 2016-12-24
        • 2020-12-26
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多