【发布时间】:2020-12-09 21:52:56
【问题描述】:
我有以下 JS 代码...
const collection=["Thing1","Thing2"];
const doSomething = (value)=>{
switch(value){
case "Thing1":
return {
arrayItems: ["Object 1", "Object 2"]
}
break;
default:
return {
arrayItems: ["Object 3", "Object 4"]
}
}
}
const result = collection.reduce(
(result, value)=> result.concat(doSomething(value).arrayItems),
[]
);
console.log(result);
// doSomething returns { "arrayItems": ["Object 1", "Object 2"] } for Thing1
// and { "arrayItems": ["Object 3", "Object 4"] } for Thing 2
// result should be ["Object 1", "Object 2","Object 3", "Object 4"]
我现在想把它变成类似这样的 Scala reduce...
val collection = ["Thing 1", "Thing 2"]
val result: Array[...] = collection
.reduce(
(array: Array[...], value: String) => {
val objectList = service.doSomething(value)
if (array != null && array.length > 0) {
array.concat(objectList)
} else {
objectList
}
});
// doSomething returns { "arrayItems": ["Object 1", "Object 2"] } for Thing1
// and { "arrayItems": ["Object 3", "Object 4"] } for Thing 2
// result should be ["Object 1", "Object 2","Object 3", "Object 4"]
但是当我尝试这个时,我得到......
type mismatch;
found : (Array[...], String) => Array[...]
required: (java.io.Serializable, java.io.Serializable) => java.io.Serializable
val result: Array[...] = doSomething(value).reduce((array: Array[...], value: String)=>{
有没有办法做到这一点?
更新
我被要求提供我想要完成的工作的背景,所以我想要完成的基本步骤是......
- 获取字符串数组
- 对生成对象集合的字符串运行 reduce 函数
- 在 reduce 函数中,我们使用字符串调用提供对象集合的服务
- 然后将这些对象与 reduce 值连接并返回
每个答案的更新
谢谢大家,在你提出之前我不知道 foldLeft 并且仍然有点理解。首先是我试图避免的工作循环......
var array : Array[BaseObject] = Array[BaseObject]()
collection.foreach((value: String) => {
val objectList = doSomething(value).arrayItems
array = array.concat(objectList)
});
我试过了……
val array: List[BaseObject] =
collection.foldLeft(List.empty[BaseObject]){
(myList, value) => {
val list : List[BaseObject] = List.from(doSomething(value).arrayList)
myList ++ list
}
};
但肯定有一些小问题,因为当我使用 gson toJson 解析时,我得到......
{"head":{...},"next":{}}
head 是 Objects 之一,但不是整个集合。
【问题讨论】:
-
如果你能解释你想要做什么并输入完整的代码可能会有所帮助(例如Arrays里面的内容) - 另外,在 Scala 中,你可以假设
null不存在,它只是为了兼容怪异的 Java 和 JS,惯用的 Scala 代码从不使用null。并且 Arrays 也不鼓励,因为它们不是真正的集合而是平台原语,它们是可变和不变的,更喜欢 List、Vector、ArraySeq 或任何真正的 immutable 集合。 -
@LuisMiguelMejíaSuárez 谢谢你的帮助,对 Scala 来说还是很新,所以我会看看 Type 的事情。我希望避免大量额外的代码,但我会尝试为问题添加一些上下文。
-
大家很抱歉 JS 有错别字
-
对不起,如果它更复杂,我想我不应该使用简单的字符串示例。
-
@JGleason 你能给我们一个
BaseObject和doSomething的基本定义吗?此外,如果您也可以将它们更改为更惯用的替代方案,或者它们是否来自外部来源,那将是一件好事。 - 另外,您有时使用array和其他collection,不确定是拼写错误还是更改了代码。
标签: javascript scala reduce