Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用原始非过滤元素的函数式语言过滤?_Javascript_Arrays_List_Scala_Functional Programming - Fatal编程技术网

Javascript 使用原始非过滤元素的函数式语言过滤?

Javascript 使用原始非过滤元素的函数式语言过滤?,javascript,arrays,list,scala,functional-programming,Javascript,Arrays,List,Scala,Functional Programming,我想返回一个映射一些过滤元素的数组,但我想保留未过滤元素的位置。 i、 有没有一个简单的方法可以做到这一点 array .filter( function(element){ // some test } ) .map( function(element){ // some mapping } ) 我提出的最接近的解决方案大致如下: array .map( function(value, index){ if (<test>) {

我想返回一个映射一些过滤元素的数组,但我想保留未过滤元素的位置。 i、 有没有一个简单的方法可以做到这一点

array
.filter(
  function(element){
    // some test
  }
)
.map(
  function(element){
    // some mapping
  }
)
我提出的最接近的解决方案大致如下:

array
.map(
  function(value, index){
    if (<test>) {
      return <mapping>(value);
    }
  }
)
对于数组中大于10的所有元素,将所有元素映射到元素*10应该会产生

[1,2,3,4,110,120]
EDIT2:我很抱歉使用了“mutate”这个词。我不是指对原始数组进行变异-我想的更多的是对数组副本进行变异。

Hej jiaweili

最简单的解决方案是将其重新分配给引用。。。变异引用 而不是数据。如果参考文献在其他地方,这会有一些好处 在他们的眼皮底下没有变异

例:

ps!第二个例子不起作用。
GL

收集
你想要什么

scala> List(2, 3, 5, 6, 9).filter(_ < 5).map(_ * 100)
res30: List[Int] = List(200, 300)

scala> List(2, 3, 5, 6, 9).collect { case i if i < 5 => i * 100 }
res31: List[Int] = List(200, 300)
scala>List(2,3,5,6,9).filter(<5).map(*100)
res30:List[Int]=List(200300)
scala>List(2,3,5,6,9)。收集{case i if i<5=>i*100}
res31:List[Int]=List(200300)

您可以将过滤和映射功能提供给“组合”功能;我试过一个例子


其思想是将“映射”(我称之为就地映射)应用于符合原始数组中过滤谓词的所有元素。

虽然这些操作原则上是可能的,但Scala库不提供它们

您可以使用索引(或索引视图)构建自己的索引:


这有点尴尬,但通常比if语句版本好一点(至少你可以分别看到筛选和赋值步骤)。

类似的东西怎么样:(psuedo-javascript)


除非明确要求您对数组进行变异(它不是“功能性的”),否则这应该可以满足您的需要。

如果您使用的是可变集合,那么它就不会真正起作用。但您可以在Scala中使用
变换

scala> val a = Array(1,2,3,4,11,12)
a: Array[Int] = Array(1, 2, 3, 4, 11, 12)

scala> a.transform {i => if(i > 10) i * 10 else i}
res10: scala.collection.mutable.WrappedArray[Int] = WrappedArray(1, 2, 3, 4, 110, 120)
编辑: 如果要将过滤器和贴图分开,请使用
视图

scala> a
res22: Array[Int] = Array(1, 2, 3, 4, 11, 12)

scala> a.view.filter(_ > 10).transform(_ * 10)
res23: scala.collection.mutable.IndexedSeqView[Int,Array[Int]] = SeqViewF(...)

scala> a
res24: Array[Int] = Array(1, 2, 3, 4, 110, 120)

你的问题是你正在考虑过滤,而过滤不是你想要的。如果不想删除元素,它不是过滤器

您只需要一张简单的地图:

array.map(x => if(x > 10) x * 10 else x)
或者,如果你认为你的情况太复杂

array.map {
    case x if x > 10 => x * 10
    case x => x
}

第二个代码没有任何变化。除非您使用的是未知的Javascript版本,该版本已修复pass-by-reference.Fixed,尽管代码最终看起来更糟。你能提供你想要的函数式语法的伪代码吗?与第一个代码片段的内容类似的东西-我想把测试函数和变异函数分开。我显然遗漏了一些东西:你的第一个例子不正是你想要的吗for?这不起作用,因为它只会返回过滤后的数组。我想要原始数组,在那里过滤的数组元素已经被改变了。所以首先这不是功能性的,因为你忽略了要点。你不想让你的程序依赖于引用在它们下面发生变异。在它们之间放置一层间接层,就像一个对象,使用一种方法来获取数组的当前版本。我认为OP正在寻找稍微修改的版本:
List(2,3,5,6,9)。collect{case I if someFilter(I)=>someMap(I);case I=>I}
@Jamil:这不是
collect
,这是
map
@Debilski,但是,丹尼尔·杰米尔:是的,我本应该更仔细地阅读这个问题。条件测试和实际映射太接近了。例如,更改代码使其仅映射并跳过条件将使其变成类似于
a.transform{i=>i*10}
的内容。重新添加一个条件需要我在条件中“重新包装”映射(
if
before,
else
after)。
scala> val a = Array(1,2,3,4,11,12)
a: Array[Int] = Array(1, 2, 3, 4, 11, 12)

scala> a.transform {i => if(i > 10) i * 10 else i}
res10: scala.collection.mutable.WrappedArray[Int] = WrappedArray(1, 2, 3, 4, 110, 120)
scala> a
res22: Array[Int] = Array(1, 2, 3, 4, 11, 12)

scala> a.view.filter(_ > 10).transform(_ * 10)
res23: scala.collection.mutable.IndexedSeqView[Int,Array[Int]] = SeqViewF(...)

scala> a
res24: Array[Int] = Array(1, 2, 3, 4, 110, 120)
array.map(x => if(x > 10) x * 10 else x)
array.map {
    case x if x > 10 => x * 10
    case x => x
}