我有一个接受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
}
}
有没有办法可以检测到不是数组的单个对象是奇怪的,可能会把它放到List中并将其传递给函数?
到目前为止,我已尝试使用typeof
并尝试动态创建新的Array
并将push
我的对象添加到其中,但它会打印出1
当我那样做的时候。
答案 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)