数组中的逻辑或运算

3
这里是我想实现我的OR的地方。
return bigData.country==["US"||"JP"] && (bigData.description=="iPhone 4S")

如上所示,我返回的是对象。如果对象的键 bigData.country 的值为 USJP,并且 bigData.description 的值为 iPhone 4S(也可以是其他设备),则会得到所需的结果。
通过以下方式可以实现:

[ A || B || C || ... ] && [ X || Y || Z ||....]

return (bigData.country=="US"||bigData.country=="JP") && (bigData.description=="iPhone 4S")

但是由于数组可以方便地添加和删除元素,我打算使用数组。如果您有其他建议,请随时提出。

如果您想尝试我的代码,请访问REPL

6个回答

3
您可以使用Array.prototype.indexOf(即!= -1)来实现此功能:
return ["US", "JP"].indexOf(bigData.country) !== -1 && ["X", "Y", "Z"].indexOf(bigData.description) !== -1;

在ES6中,您可以使用Array.prototype.includes,例如:

return ["US", "JP"].includes(bigData.country) && ["X", "Y", "Z"].includes(bigData.description);

2
使用数组:
return ['US','JP'].indexOf(bigData.country) >= 0 &&
       ['iPhone 4S'].indexOf(bigData.description) >= 0;

带有一个对象(可能会有更好的表现):
return {'US': true,'JP': true}[bigData.country] &&
       {'iPhone 4S': true}[bigData.description];

正如@ibrahim mahrir所指出的那样,对象方法并不总是适用。例如,如果bigData.country=='toString'。这是因为Javascript对象来自它们的默认Object原型带有一些默认的方法。在真实世界的场景中,遇到这个问题的可能性微乎其微,但如果你想做得非常正确,有两个选择:
1 - 使用hasOwnProperty()
return {'US': true,'JP': true}.hasOwnProperty(bigData.country) &&
       {'iPhone 4S': true}.hasOwnProperty(bigData.description);

2 - 使用没有原型的对象。这种设置更加冗长,但使用起来更方便。您还可以编写一个简单的方法,将常规对象转换为没有原型的对象。
var countries = new Object(null);
countries['US'] = true;
countries['JP'] = true;

var descriptions = new Object(null);
descriptions['iPhone 4S'] = true;

return countries[bigData.country] &&
       descriptions[bigData.description];

1
第二种方法不是很可靠。例如,如果 bigData.description === "toString" ... 可能使用 hasOwnProperty,但这样我们又回到了第一种方法。 - ibrahim mahrir

2
您可以像这样使用Array#some() 方法

ES6:

return ['US','JP'].some(val => bigData.country === val) && ['iPhone 4S'].some(v => bigData.description === v);

ES5:

return ['US','JP'].some(function(val){return bigData.country === val}) && ['iPhone 4S'].some(function(v){return bigData.description === v});

演示:

let bigData = {
  country: 'JP',
  description: 'iPhone 4S'
};

console.log(['US', 'JP'].some(val => bigData.country === val) && ['iPhone 4S'].some(v => bigData.description === v));


1
您可以使用对象作为测试的数据结构:
var countries = {
        US: true,
        JP: true
    };


return countries[bigData.country] && ...

1

使用 ES6 Set (REPL):

const countriesToKeep = new Set(['GP', 'US']);

console.log(countriesToKeep.has('UK'));

console.log(countriesToKeep.has('GP'));


1

使用Array.prototype.includes很可能是您需要的:

let valid = {
  countries: ['US', 'JP'],
  description: 'iPhone 4S'
};
let dataset = [{
  country: 'US',
  description: 'iPhone 4S',
  expected: true
}, {
  country: 'JP',
  description: 'iPhone 4S',
  expected: true
}, {
  country: 'AA',
  description: 'iPhone 4S',
  expected: false
}, {
  country: 'US',
  description: 'iPhone',
  expected: false
}]

// iterate over data values
dataset.forEach(data => {
  let is_valid = valid.countries.includes(data.country) && valid.description == data.description;
  
  console.log(
    `Country:"${data.country}"`,
    `Description:"${data.description}"`,
    `Expected:${data.expected}`,
    `Got:${is_valid}`
  );
});


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接