【问题标题】:How to safely wrap an object into an array in JavaScript如何在 JavaScript 中安全地将对象包装到数组中
【发布时间】:2016-09-28 14:56:16
【问题描述】:

我有一个接收Array 的函数,遍历它找到所有Objects 并将它们显示到用户界面。

在极少数情况下,我必须提供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

【问题讨论】:

  • 单项是否在数组中?如果不是,您可以检查variable is an array。如果是你可以检查array.length == 1.
  • 它不是一个列表,它是一个数组......而且在 js 中它们是一种特殊的对象,所以如果你编写对象方法,它们也适用于数组
  • List 在 JavaScript 中被称为 arrayJSON 也是 文本数据 - 因为它代表“JavaScript Object Notation”,那么如果它已经在 J​​avaScript 中,它就是一个对象。

标签: javascript arrays javascript-objects


【解决方案1】:

一个班轮:

[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"}]

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这比使用 .flat() 更安全,因为它适用于对象和单个值。例如:const item1 = "string";const item2 = {value: "string"}; 都将安全返回 const result = [].concat(item1); // still works and returns ["string"]const result = [].contact(item2); // still works and returns [{value:"string" }]
    【解决方案3】:

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

    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 不需要像方法一样被调用。

    让我知道它是否有效

    干杯

    【讨论】:

    • 如果条件像(supportedLongs instanceof Array) === false会更好
    【解决方案4】:

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

    【讨论】:

    【解决方案5】:

    您需要检查数组并修复错误 - 应该只是 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]);
        }
    }
    

    【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 这个答案不正确 - 它产生一个嵌套数组。
    猜你喜欢
    • 1970-01-01
    • 2015-08-12
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多