如何在JavaScript中安全地将对象包装成数组
How to safely wrap an object into an array in JavaScript
我有一个函数,它接受一个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
,并尝试在飞行中创建一个新的Array
和push
我的对象,但它打印出一个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"}]
相关文章:
- 为什么要包装每一个原型“;类“;JS中具有匿名函数的对象
- 在jquery$({})中包装纯javascript对象
- 在$.ajax调用中将附加数据添加到jQuery包装的对象数据中
- 面向对象的WebGL上下文包装失败
- 发送到谷歌应用脚本的谷歌电子表格对象包装器中是否存在错误
- jQuery 插件 datetimepicker 未被 Date() 对象包装器识别为日期的问题
- 将对象包装成函数
- 为什么没有't一个Null的内置对象包装器
- Breezejs EntityType.createEntity没有用可观察对象包装属性
- 对象包装在JavaScript中是不可变的
- TypeScript/JavaScript中的多对象包装器
- 使用对象包装器扩展JavaScripts DOM
- 如何在JavaScript中安全地将对象包装成数组
- 如何在YUI对象包装器中包装javascript对象文字?
- 如何允许javascript中的多个实例if对象包装在匿名函数中
- 如何解析对象包装在另一个 json 数组中的 JSON 字符串
- Underscore.js中的_()函数(对象包装器)是如何工作的
- 如何使用Javascript或Jquery将JSON对象包装在数组中
- JavaScript中的原语和对象包装等效性
- 有没有一种方法可以在jQuery中创建一个延迟的对象包装器?