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

How to safely wrap an object into an array in JavaScript

本文关键字:对象 包装 数组 安全 JavaScript      更新时间:2023-09-26

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

在极少数情况下,我必须提供Object (WS作为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
    }
}

是否有一种方法,我可以检测到,这不是一个数组的单一对象是一个奇数,可能把它放在一个列表上,并将其传递给一个函数?

到目前为止,我已经尝试使用typeof,并尝试在飞行中创建一个新的Arraypush我的对象,但它打印出一个1,当我这样做

使用Array.prototype.flat:

[couldBeArray].flat()

例子:

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

您可以简单地使用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)

你可以把它转换成数组,如果不是,让迭代一次:

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
    }
}

同样,length也不需要像调用方法那样调用。

让我知道它是否有效

欢呼

数组。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
    }
}

您需要检查数组并修复错误-应该只是data.length,没有括号。查看下面的代码,查看demo - 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]);
    }
}

可以使用Array.of()。在你的例子中,Array.of(data)返回[{ "name" : "I am not in a List"}]