有没有一种不那么冗长的方法可以在对象数组中找到对象键



遗憾的是,我无法更改收到的数据。所以我找到了解决办法,但我觉得有点乱。

以下是我正在使用的数据示例:

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'} ]
}

如果data1data2的名称为: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);

最新更新