【问题标题】:Javascript function in associative array not working关联数组中的 Javascript 函数不起作用
【发布时间】:2015-06-04 11:00:24
【问题描述】:

我正在尝试获取以下内容以返回适当的密钥,但始终只获得 9 个。帮助,谢谢。

var strZip = "96161";

var regionCodes = {
4: '00501',    
4: '00544',    
4: '06390',    
2: '96161',    
2: '96162',
getKey: function(value){
    for(var key in this){
        if(this[key] == value){
            return key;
        }
    }
    return 9; // Default 9 if not found
    }
};

var zipKey = regionCodes.getKey(strZip);

我也尝试过(但失败了)变体:

getKey: function(value){
    for(var key in this){
        if( this.hasOwnProperty( key) ) {
            if(this[key] === value){
                return key;
            }
        }
    }
    return 9; // Default 9 if not found
}

【问题讨论】:

  • 第二个2: '96162' 覆盖第一个。同一个“键”上不能有多个“值”
  • 您的代码显示了一个具有重复属性名称的对象。
  • 您应该恢复地图(将您的值作为键)或使用数组。
  • js 没有 associative array,所以当你定义文字对象时 - js 没有 push 每个属性,而是用最后一个值覆盖相同的键
  • 值得一提的是,出于某种原因,Ecmascript 6 实际上会支持重复的对象键。

标签: javascript


【解决方案1】:

您的对象中有相同的键 {4:,4:,4:,2:,2:}。尝试使键独一无二改变你的方法,就像在 Andys 的回答中一样。

否则,只有当值恰好是对象中的第一个键时,它才会起作用

var strZip = "96161";

var regionCodes = {
1: '00501',    
2: '00544',    
3: '06390',    
4: '96161',    
5: '96162',
getKey: function(value){
    for(var key in this){
        if(this[key] == value){
            return key;
        }
    }
    return 9; // Default 9 if not found
    }
};

var zipKey = regionCodes.getKey(strZip);
console.log(zipKey);

key -> arrayindexOf()一起使用

var strZip = "961261";

var regionCodes = {
4: ['00501', '00544',  '06390'],
2: ['96161', '96162'],
getKey: function(value){
    for(var key in this){
        if(typeof(this[key]) != 'function' && this[key].indexOf(value) > -1){
            return key;
        }
    }
    return 9; // Default 9 if not found
    }
};

var zipKey = regionCodes.getKey(strZip);
console.log(zipKey);

【讨论】:

  • 希望对否决票做出解释,好吗? :)
  • 因为看起来实际的键很重要,否则 OP 不会尝试指定多个键。你返回了错误的键。例如,您返回的是 1 而不是 4
  • @Andy,OP 说'我正在尝试获取以下内容以返回适当的密钥,但一直只获得 9。'...我解释了为什么他得到 9。如果实际密钥是重要的是,他将需要尝试另一种方法,例如您的答案。我更改了键以显示他的错误,仅此而已
  • 您说:“尝试使密钥独一无二。”而这显然不是 OP 想要的。
  • @Andy,我在后面说过否则,只有当值恰好是对象中的第一个键时,它才会起作用。无论如何,我很感激你的意见,即使它是反对票。我只是担心我的回答可能在技术上不正确
【解决方案2】:

假设键很重要,并且与其他答案所暗示的不同,它们实际上是以您在问题中输入的形式需要的,请将您的键/代码放在一个数组中,而不是为每个组使用一个对象。然后你可以在数组上使用filter,根据提供的代码提取出正确的密钥:

var regionCodes = {

    codes: [{
        key: 4, code: '00501'
    }, {
        key: 4, code: '00544'
    }, {
        key: 4, code: '06390'
    }, {
        key: 2, code: '96161'
    }, {
        key: 2, code: '96162'
    }],

    getKey: function (value) {
        var arr = this.codes.filter(function (el) {
            return el.code === value;
        });
        return arr.length ? arr[0].key : 9;
    }
};

DEMO

【讨论】:

    猜你喜欢
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多