遗憾的是,我无法更改收到的数据。所以我找到了解决办法,但我觉得有点乱。
以下是我正在使用的数据示例:
var x = {
// a simple array, we like these.
data1: ['this', 'that', 'other'],
// I don't know why it's like this, and I can't change it
data2: [ {name:'joe'}, {name:'john'} ]
}
如果data1
或data2
的名称为:joe,则目标是运行一段代码。
if( x.data1.includes('joe') || x.data2.includes('joe') ){...}
显然,第二个条件对数据不起作用。
我转而将data2
格式化为一个简单的数组,其中包含一个函数:
var formatData2 = function(){
var arr = [];
for( i in x.data2 ){
arr.push( x.data2[i].name );
}
return arr;
}
然后让我使用这个逻辑:
if( x.data1.includes('joe') || formatData2().includes('joe') ){...}
问题是:
我可以避免将data2
格式化为数组来检查if语句中的值吗?
var x = {
data1: ['this', 'that', 'other'],
data2: [ {name:'joe'}, {name:'john'} ]
}
var formatData2 = function(){
var arr = [];
for( i in x.data2 ){
arr.push( x.data2[i].name );
}
return arr;
}
if( x.data1.includes('joe') || formatData2().includes('joe') ){
console.log( true );
}
您可以使用some()
方法。
if (x.data1.includes('joe') || x.data2.some(el => el.name == 'joe'))
顺便说一句,使用map()
可以简化您的formatData2()
功能
function formatData2(x) {
return x.data2.map(el => el.name);
}
您可以使用some((在对象数组上循环,并在满足条件时返回true。
var x = {
data1: ['this', 'that', 'other'],
data2: [ {name:'joe'}, {name:'john'}, ],
};
const result = x.data1.includes('joe') || x.data2.some(({name})=> name === 'joe');
console.log(result);