在JavaScript中如何比较正在使用的两个相似值并相应地分配它们?

时间:2018-05-01 16:23:41

标签: javascript

所以我的Rails应用程序中有一个表单需要使用缩写传递选项值。例如:

<label for="country-north-america">Country</label>
 <select class="form-control" name="country-north-america" id="country-north-america>
  <option value="CA">Canada</option>

<label for="state">State></label>
 <select class="form-control" name="state" id="state">
  <option value="CA">California</option>

然后在我的JS文件中,我将状态分配给客户经理:

let users = [
 {
  default: true,
  name: 'Bill',
  states: ['South America', 'Canada', 'Asia']
 },
  name: 'Frank',
  states: ['AK', 'AZ', 'CA']
 }]

然后我还有:

var findUserByStateOrRegion = function(stateOrRegion) {
  for (i = 0; i < users.length; i++) {
    var u = users[i];
    if (u.states.includes(stateOrRegion)) {
      return u;
    }
  }
};

所以问题是,对于加拿大的Frank来说,因为价值是CA.但是,如果我将JS中的加拿大更新为CA,那么加利福尼亚将转到Bill。我想弄清楚的是如何使用CA作为值将加拿大分配给Bill。

编辑:尝试以下内容:

  var findUserByStateOrRegion = function(stateOrRegion) {
  for (i = 0; i < users.length; i++) {
    var u = users[i];
    if (u.states === 'CA' && u.country === 'CA') {
      return u.default;
    }
    else (u.states.includes(stateOrRegion)) {
      return u;
    }
  }
};

然后将默认值设为以下内容:

{
 default: true,
 name: 'Bill',
 country: 'CA',
 states: ['South America', 'CA', 'Asia']
}

没用。没有错误或任何存在。但这显然不会影响到这个国家。

2 个答案:

答案 0 :(得分:0)

对于初学者,我相信你的JS可能存在错误。

let users = [
 {
  default: true,
  name: 'Bill',
  states: ['South America', 'Canada', 'Asia']
 },{
  name: 'Frank',
  states: ['AK', 'AZ', 'CA']
 }]

根据您的情况,看起来Frank和Bill应该是单独的对象,而不是让Frank成为Frank中的孩子。

在这种情况下,您尝试做的是为2+个结果分配特定值。在这种情况下,标准解决方案是为州/省使用2位数代码,而国家/地区使用3位数代码。

将您的状态“key”视为主键/变量。您正在更改该变量的值,而是需要另一个键。

另外,如果需要2位数国家/地区代码,则需要唯一标识国家/地区。你可以在你的对象中添加另一个属性来分别存储国家和州/省(我不建议这样做,但这是另一种选择)。

祝你好运。

---- ---- EDIT

进一步审查。您是否可以澄清您是否匹配CA:加利福尼亚州和CA:加拿大,或者如果您的功能(.include)与“ CA lifornia”和“ CA ”相匹配nada“,如果是这样,那是因为非严格匹配。 如果您为比较强制执行“严格”匹配,则只会返回与您的要求完全匹配的匹配。

答案 1 :(得分:0)

因此,不是搞乱状态/国家/地区,而是专门针对那些确切对象的匹配,而是匹配匹配的对象的数量,因为这是一个人的问题,特别是只有两个人。

 var findUserByLocations = function(locations) {
  var match;
  if (locations.length !== 2) {
    for (var i = 0; i < locations.length; i++) {
      match = users.find(function(user) { 
        return user.states.includes(locations[i]); 
      });
      if (match) return match;
    }
  }
  return findDefaultUser();
};

是的,我知道如果有时候这种情况适用于其他人则会崩溃。