我编写了一个函数,该函数必须支持两种类型的参数// simplified example
let doSome = names => names.map(name => name.toUpperCase())
names(['Bart', 'Lisa'])
// [ 'BART', 'LISA' ]
names('Homer')
// TypeError: names.map is not a function
用于值列表。在内部它将参数作为数组处理。
单个名称以字符串形式给出,多个名称以字符串数组形式给出。
flatten()
我找到了将Array.of()
与doSome = names => Array.of(names).flatten().map(name => name.toUpperCase());
结合使用的解决方案,该解决方案需要一些babel配置。
package com.example.restful2;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.restlet.representation.Representation;
import org.restlet.resource.ClientResource;
public class MainActivity extends AppCompatActivity {
public final String TAG = "RESTlet app";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textview = findViewById(R.id.text);
try {
ClientResource cr = new ClientResource("http://jsonplaceholder.typicode.com/todos/1");
Representation r = cr.get();
String json = r.getText();
textview.setText(json);
} catch (Exception e) {
Log.w(TAG, "Error occurred: " + e.getMessage());
}
}
}
JavaScript中是否有惯用的方式来获取没有类型检查的数组?
答案 0 :(得分:28)
您可以使用Array.concat()
,因为concat既可以接受数组,也可以接受非数组:
const names = (v) => [].concat(v).map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
console.log(names('Homer')) // ['HOMER']
答案 1 :(得分:2)
如果您已经有依赖于此功能的代码,则可能无法以这种方式实现它。不过,允许您的函数接受可变数量的参数with rest parameters可能会更干净。
这意味着您可以将函数调用为names('Homer')
或names('Bart', 'Lisa')
:
function names(...args){
return args.map(name => name.toUpperCase());
}
console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
console.log(names('Homer')); // ['HOMER']
如果您真的想使用数组作为参数来调用该函数,则可以使用spread syntax:
console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]
如果将它与字符串一起使用,则会返回一个字符数组,
console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]
答案 2 :(得分:2)
为什么不只检查输入是否为数组还是不使用isArray()?
我使用这种方法提出了另一种解决方案,我还在map()
内放置了一个控件,因此当name
参数为null
或undefined
时,这不会失败。
const names = x => (Array.isArray(x) ? x : [x]).map(name => name && name.toUpperCase());
console.log(JSON.stringify( names(['Bart', 'Lisa']) ));
console.log(JSON.stringify( names('Homer') ));
console.log(JSON.stringify( names('') ));
console.log(JSON.stringify( names(null) ));
console.log(JSON.stringify( names([null]) ));
console.log(JSON.stringify( names([undefined, "Roger", "Bob", null]) ));
答案 3 :(得分:0)
答案 4 :(得分:0)