如何使用多个键来影响具有相同值的对象

时间:2015-10-04 05:33:43

标签: javascript

我有一些基于状态的规则查找。我试图想办法让访问这些很容易,而不需要设置某种中间步骤。

我想象的是:

static int a

我知道那是不可能的......但是想知道实现类似目标的最简单方法是什么

6 个答案:

答案 0 :(得分:6)

从MySQL的外键中获取一页:

var states = {
   'AK' : 1,
   'FL' : 1,
   'NY' : 1,
   'CA' : 2,
   'LA' : 2,
   'TX' : 2
}

var rules = {
    1 : 278,
    2 : 422
}

然后你可以像这样引用规则:

console.log(rules[states['AK']]);

答案 1 :(得分:1)

我知道这是一个临时解决方案。只是想分享它。

function Store() {
  var cache = {};
  this.set = function(key, value) {
    var k = JSON.stringify(key);
    cache[k] = value;

  };
  this.get = function(key) {
    for(var k in cache) {
      if(cache.hasOwnProperty(k)) {
        var _k = JSON.parse(k);
        if(_k.indexOf(key) !== -1) return cache[k];
      }
    }
    return null;
  }
}

var store = new Store;

store.set(['AK','FL','NY'], {a:278});
store.get('AK'); // returns {a:278}

答案 2 :(得分:1)

影响具有相同规则的键:

var rule1 = {a : 278}; 
var rule2 = {a : 422}; 

var rules = {
     'AK' : rule1, 
     'FL' : rule1, 
     'NY' : rule1, 
     'CA' : rule2, 
     'TX' : rule2
}; 

console.log(rules['AK']);   // {a:278}
console.log(rules['AK'].a); // 278

https://jsfiddle.net/sb5az0v5/

答案 3 :(得分:1)

如果您真的想要接近您显示的结构,请将rules定义为数组:

var rules = [
  [['AK','FL','NY'], {a: 278}],
  [['CA','LA','TX'], {a: 422}]
];

然而,访问它会有点麻烦:

function find_rule(state) {
  for (var [states, rule] of rules) {
    if (states.indexOf(state) >= 0) return rule;
  }
  return -1;
}

或没有ES6:

function find_rule(state) {
  for (var i = 0; i < rules.length; i++) {
    var rule = rules[i];
    if (rule[0].indexOf(state) >= 0) return rule[1];
  }
  return -1;
}

答案 4 :(得分:0)

var rules = {
    "['AK','FL','NY']": {a: 278},
    "['CA','LA','TX']": {a: 422}
};
var key = 'AK';
key = Object.keys(rules).filter(function (val) {
    return val.indexOf(key) !== -1;
}).join(",");


console.log("result: ", rules[key]);//result: {a: 278}
console.log("key: ", JSON.parse(key.replace(/'/g, '"')));//key:  ["AK", "FL", "NY"]

答案 5 :(得分:0)

我做了类似的事

var rules = { 
//Data
    "['AK','FL','NY']": {a: 278},
    "['CA','LA','TX']": {a: 422},
    BA: {a: 111},
    BC: {a: 222},
//Function
    getKey: function(key){
      return Object.keys(this).find((val) => {
        return val.replace(/(\[|\]|'|")/g,'')
            .split(',')
            .includes(key)
        }
      )
    },
    get: function(key){
        return this[this.getKey(key)]
    }
}

console.log(rules.get('AK')) //{a: 278}
console.log(rules.get('BA')) //{a: 111}