数组中的逻辑OR

时间:2017-11-23 20:27:31

标签: javascript arrays algorithm logical-operators

以下是我要实施OR

的地方
return bigData.country==["US"||"JP"] && (bigData.description=="iPhone 4S")
  

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

如上所示,如果对象bigData.country的键值为USJPAND bigData.description,我将返回对象是iPhone 4S,也可以是更多设备。

我能够通过

获得所需的结果
return (bigData.country=="US"||bigData.country=="JP") && (bigData.description=="iPhone 4S")

但是,由于我可以方便地添加和删除数组,我正在尝试使用数组。建议使用不同的东西。

如果您想在我的代码中使用 REPL

6 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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];

答案 2 :(得分:1)

使用ES6 SetREPL):



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

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

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




答案 3 :(得分: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}`
  );
});

答案 4 :(得分:1)

您可以像这样使用 Array#some() method

<强> 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});

<强>演示:

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

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

答案 5 :(得分:1)

您可以使用对象作为测试的数据结构:

var countries = {
        US: true,
        JP: true
    };


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