admin管理员组文章数量:1327961
Here is where I want to implement my OR
return bigData.country==["US"||"JP"] && (bigData.description=="iPhone 4S")
[ A
||
B||
C||
... ]&&
[ X||
Y||
Z||
....]
As you can see above, I am returning objects, if the value of key of object bigData.country
is either US
or JP
, AND
bigData.description
is either iPhone 4S
, can also be more devices.
I'm able to get the desired result, by
return (bigData.country=="US"||bigData.country=="JP") && (bigData.description=="iPhone 4S")
But as I can have convenience to add and remove from an Array, I am trying to use an array. Suggestion to use something different is also weled.
If you want to play around with my code here is REPL
Here is where I want to implement my OR
return bigData.country==["US"||"JP"] && (bigData.description=="iPhone 4S")
[ A
||
B||
C||
... ]&&
[ X||
Y||
Z||
....]
As you can see above, I am returning objects, if the value of key of object bigData.country
is either US
or JP
, AND
bigData.description
is either iPhone 4S
, can also be more devices.
I'm able to get the desired result, by
return (bigData.country=="US"||bigData.country=="JP") && (bigData.description=="iPhone 4S")
But as I can have convenience to add and remove from an Array, I am trying to use an array. Suggestion to use something different is also weled.
If you want to play around with my code here is REPL
Share Improve this question asked Nov 23, 2017 at 20:27 Dhaval JardoshDhaval Jardosh 7,3095 gold badges34 silver badges74 bronze badges6 Answers
Reset to default 3You can use Array.prototype.indexOf
(to be != -1
) like this:
return ["US", "JP"].indexOf(bigData.country) !== -1 && ["X", "Y", "Z"].indexOf(bigData.description) !== -1;
Or in ES6, you can use Array.prototype.includes
like:
return ["US", "JP"].includes(bigData.country) && ["X", "Y", "Z"].includes(bigData.description);
You can use Array#some()
method like this:
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});
Demo:
let bigData = {
country: 'JP',
description: 'iPhone 4S'
};
console.log(['US', 'JP'].some(val => bigData.country === val) && ['iPhone 4S'].some(v => bigData.description === v));
With an Array:
return ['US','JP'].indexOf(bigData.country) >= 0 &&
['iPhone 4S'].indexOf(bigData.description) >= 0;
With an object (possibly better performance):
return {'US': true,'JP': true}[bigData.country] &&
{'iPhone 4S': true}[bigData.description];
As pointed out by @ibrahim mahrir, the object approach doesn't always work. For example, if bigData.country=='toString'
. This is because Javascript objects e with a default baggage of methods from their default Object
prototype. In a real world scenario the likelihood of running afoul of this problem is negligible, but if you want to do it really really properly, there are two options:
1 - Use hasOwnProperty()
:
return {'US': true,'JP': true}.hasOwnProperty(bigData.country) &&
{'iPhone 4S': true}.hasOwnProperty(bigData.description);
2 - Use an object WITHOUT a prototype. This is more verbose to set up, but also more convenient to use. You can also write a trivial method that converts a regular object to a prototype-less object.
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];
Use an ES6 Set (REPL):
const countriesToKeep = new Set(['GP', 'US']);
console.log(countriesToKeep.has('UK'));
console.log(countriesToKeep.has('GP'));
You could use an object as data structure for testing:
var countries = {
US: true,
JP: true
};
return countries[bigData.country] && ...
Using Array.prototype.includes
is most likely what you're after:
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}`
);
});
本文标签: javascriptLogical OR in an ArrayStack Overflow
版权声明:本文标题:javascript - Logical OR in an Array - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1742213502a2434144.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论