将字符串参数转换为一个元素的数组

时间:2019-01-04 12:39:05

标签: javascript arrays string ecmascript-6

我编写了一个函数,该函数必须支持两种类型的参数// 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中是否有惯用的方式来获取没有类型检查的数组?

5 个答案:

答案 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参数为nullundefined时,这不会失败。

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)

在这种情况下,也许Array#flat的一种可能即将出现的方法会有所帮助(实际上仅在Chrome和FF中有效)。

continual_retry(3)(divide)

答案 4 :(得分:0)

简短版本:

[names].flat()

如果 names 是一个数组,它将保持原样。其他任何内容都将转换为一个元素的数组。

Demo