Javascript 使用原始非过滤元素的函数式语言过滤?
我想返回一个映射一些过滤元素的数组,但我想保留未过滤元素的位置。 i、 有没有一个简单的方法可以做到这一点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>) {
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
}