我从API收到了一个data
值,并且我想为处理该条件创造条件。有时它可以作为数组或对象出现。我将使用一个简单的示例。
data = [1,2,3] // These values come from API
data.map(i => i++)
问题是:有时data
也可能会这样
data = {
arr: [1,2,3]
}
// It evals an error in .map, because now "data" is an object
我知道我可以解决这个问题,
if(Array.isArray(data))
data.map(i => i++);
else
data.arr.map(i => i++);
但是我的代码不仅仅是一行.map
。有没有一种方法可以使这种简单的条件不进行复制和粘贴代码?
谢谢!
答案 0 :(得分:3)
例如,您可以将数组引用分配给另一个变量,并在其余代码中使用它,如下所示:
let arr = Array.isArray(data) ? data : data.arr;
arr.map(i => i++)
答案 1 :(得分:2)
您可以使用ternary运算符。
Array.isArray(data)
? data.map(i => i++);
: data.arr.map(i => i++);
答案 2 :(得分:2)
您可以使用destruction es6,虽然不确定是个好主意,但是可以单行实现功能。 ;)
let { arr=data } = data;
arr.map(i => i++)
如果在数据中未找到arr键,则它将分配默认数据数组。 干杯
答案 3 :(得分:1)
您可以这样做
如果是数组,则可以使用三元运算符并将其值直接作为数组分配给temp;如果不是,则可以使用input.arr
这样的属性来分配给temp。
因此,一旦值以数组形式出现,您就可以使用单个map语句,因此您无需重复执行map语句。
let data = [1,2,3];
let data1 = {
arr: [1,2,3]
}
function handle(input){
let temp = Array.isArray(input) ? input : input.arr
return temp.map(i => i++);
}
console.log(handle(data))
console.log(handle(data1))
答案 4 :(得分:1)
如果您不想使用if
或ternary
运算符,则可以使用Object.values(data).flat()
将data
转换为:
[1, 2, 3]
这基本上不会修改您的数组并将其保留,但是,它将把您的数据对象压缩为数组形式。
请参阅下面的工作示例:
数据格式1(obj):
const data = {arr: [1, 2, 3]};
const res = Object.values(data).flat().map(i => ++i);
console.log(res);
数据形式2(数组):
const data = [1, 2, 3];
const res = Object.values(data).flat().map(i => ++i);
console.log(res);
请注意,Object.values
不保证顺序,因此数组可能会丢失其顺序。此外,如果您打算在生产环境中使用此功能,.flat()
尚不支持所有浏览器,而是可以考虑使用polyfill选项
答案 5 :(得分:1)
一个简单的OR(||
)运算符是非常惯用的JavaScript:
(data.arr || data).map(i => ++i);
如果定义了data.arr
属性,则将被映射,否则data
本身将被映射。
完整代码段:
注意:后增量运算符将无效,因此我将其替换为前增量。
let data, result;
data = [1, 2, 3];
result = (data.arr || data).map(i => ++i);
console.log(result);
data = {
arr: [1, 2, 3]
}
result = (data.arr || data).map(i => ++i);
console.log(result);