Javascript-对对象和数组使用条件

时间:2018-12-11 11:39:26

标签: javascript

我从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。有没有一种方法可以使这种简单的条件不进行复制和粘贴代码?

谢谢!

6 个答案:

答案 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)

如果您不想使用ifternary运算符,则可以使用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);