如何在JavaScript中将对象安全地包装到数组中

时间:2016-09-28 14:56:16

标签: javascript arrays javascript-objects

我有一个接受Array的函数,迭代查找所有Objects并将其显示到UI。

在极少数情况下,我必须提供ObjectWS的结果为application/JSON)默认情况下不是Array,因此我的功能无法迭代它并在UI上显示。

在正常情况下,我的Array看起来像这样:

[
  { "name" : "foo"},
  { "name" : "bar"},
  { "name" : "baz"}
]

这就像它应该的那样。但是,有时我得到的数据可能是这样的:

{ "name" : "I am not in a List"}

我接受数组的函数如下所示:

function loadJSONIntoUI(data) {

    for (var aMsg = 0; aMsg < data.length(); aMsg++) {
        // Do something with each `index` in the List
    }
}

有没有办法可以检测到不是数组的单个对象是奇怪的,可能会把它放到List中并将其传递给函数?

到目前为止,我已尝试使用typeof并尝试动态创建新的Array并将push我的对象添加到其中,但它会打印出1当我那样做的时候。

6 个答案:

答案 0 :(得分:5)

Array.isArray可用于实现您的需求:

function loadJSONIntoUI(data) {
    if(!Array.isArray(data)) {
        data = [data];
    }
    for (var aMsg = 0; aMsg < data.length(); aMsg++) {
        // Do something with each `index` in the List
    }
}

答案 1 :(得分:5)

如果不是,你可以在一个数组中转换它并让它迭代一次:

function loadJSONIntoUI(data) {

    if(!(data instanceof Array)){
       data = [data];
    }

    for (var aMsg = 0; aMsg < data.length; aMsg++) {
        // Do something with each `index` in the List
    }
}

此外,长度不需要像方法那样被调用。

让我知道它是否有效

干杯

答案 2 :(得分:2)

您需要检查数组并修复错误 - 应该只是data.length,没有括号。请参阅下面的代码,查看演示 - https://fiddle.jshell.net/ermakovnikolay/fgedaubm/

function loadJSONIntoUI(data) {
    var data = Array.isArray(data) ? data : [ data ];
    for (var aMsg = 0; aMsg < data.length; aMsg++) {
        // Do something with each `index` in the List
        console.log(data[aMsg]);
    }
}

答案 3 :(得分:1)

您可以使用Array.of()。因此,在您的情况下,Array.of(data)返回[{ "name" : "I am not in a List"}]

答案 4 :(得分:1)

一个衬板:

[couldBeArray].flat()

示例:

const anObj = {name: "Hi"};
const anArr = [{name: "Hi"}];

const wrapped1 = [anObj].flat() // wrapped1 is [{name: "Hi"}]
const wrapped2 = [anArr].flat() // wrapped2 is [{name: "Hi"}]

答案 5 :(得分:0)

您可以简单地使用Array.concat()将对象自动包装到数组中:

const obj = {name: "foo"};
const arr = [{name: "bar"}];

const result1 = [].concat(obj); // result1 is [{name: "foo"}]
const result2 = [].concat(arr); // result2 is [{name: "bar"}]

console.log(result1)
console.log(result2)