Javascript映射在键中有两个值

时间:2011-12-21 19:59:53

标签: javascript

我的页面上有3个下拉列表,第3个下拉列表中的选项取决于前两个下拉列表中的选项。

所以我想知道是否有办法在带有二维密钥的javaScript中实现地图?像<Key1, Key2> -> Value一样。

我认为一种简单的方法是将两个密钥连接成一个字符串。有没有更好的方式?

感谢。

8 个答案:

答案 0 :(得分:6)

您可以拥有一个包含更多对象的对象:

var options = {
    'option 1': {
        'option 1.1': [
            'option 1.1.1',
            'option 1.1.2',
            'option 1.1.3',
            'option 1.1.4'
        ],
        'option 1.2': [
            'option 1.2.1',
            /* etc. */
};

然后,您将访问第三个下拉列表的选项options[firstSelectedValue][secondSelectedValue]


编辑:Here's a demo, too,使用您在使用Internet Explorer 8或更低版本浏览时可能需要实施的一些新功能:)

答案 1 :(得分:4)

您可以将密钥设置为数组。只需创建数组[key1, key2]; 然后将该值设置为您的键并将其与您的值相关联。

obj[[key1,key2]] = "my value";

这是一个jsFiddle http://jsfiddle.net/TwQLW/

答案 2 :(得分:1)

连接两个键有什么问题?您所需要的只是确保连接键是唯一的,我想这可以通过将两个值与两个键中任何一个都没有使用的字符分开来轻松实现。

答案 3 :(得分:0)

没有其他办法。 JS映射是普通对象,因此键与属性名称相同。即使你试图使用例如。数组作为键,它将被转换为字符串。您应该将此字符串与数组之间的某些特殊字符串连接或存储在数组中,并在每次访问时扫描它。

答案 4 :(得分:0)

我为此目的创建了一个通用数据结构,因为我遇到了类似的问题:

https://github.com/vikashmadhow/map

自从提出这个问题以来,我知道已经过了很长时间了;希望这对其他人有帮助。

答案 5 :(得分:0)

我一直在寻找类似的数据结构,但找不到。我一直在使用TypeScript,所以我使用TypeScript开发了一个解决方案。

count

您只需创建一个包含两个键的地图,如下所示:

export class TwoMapKey<T> {
    private __map__: object;

    constructor() {
        this.__map__ = new Object();
        this.get = this.get.bind(this);
        this.set = this.set.bind(this);
        this.remove = this.remove.bind(this);
        this.keys = this.keys.bind(this);
        this.nestedKeys = this.nestedKeys.bind(this);
        this.clear = this.clear.bind(this);
    }

    public get(key: string, nestedKey: string): T {
        if (!this.__map__[key] || this.__map__[key] && !this.__map__[key][nestedKey])
            return;

        return this.__map__[key][nestedKey];
    }

    public set(key: string, nestedKey: string, value: T): void {
        if (!this.__map__[key]) {
            this.__map__[key] = new Object();
        }

        Object.defineProperty(this.__map__[key], nestedKey, { value: value, configurable: true, enumerable: true });
    }

    public remove(key, nestedKey): void {
        if (!this.__map__[key]) {
            return;
        }

        delete this.__map__[key][nestedKey];
    }

    public keys(): string[] {
        return Object.getOwnPropertyNames(this.__map__);
    }

    public nestedKeys(): Array<string[]> {
        return Object.getOwnPropertyNames(this.__map__).map(key => Object.keys(this.__map__[key]));
    }

    public clear(): void {
        Object.getOwnPropertyNames(this.__map__).forEach(property => {
            delete this.__map__[property];
        });
    } }

它不如HashMap那么高效。您应该能够轻松地在ES6或ES5中转换相同的内容。

答案 6 :(得分:0)

您可以通过使用ES6语法将两个键作为键数组添加到哈希对象上来实现。然后,您可以使用数组过滤器和正则表达式进行搜索:

const key1 = "key1";
const key2 = "key2";
const value = "whatever";

const hashObject = {};
const firstEntry = [key1, key2];
const secondEntry = [key2, key1];
const entryValue = { value };

hashObject[firstEntry] = entryValue;
hashObject[secondEntry] = entryValue;

const regByFirstKey = new RegExp(`${key1},.`);
const regBySecondKey = new RegExp(`.,${key2}`);

const keysArray = Object.keys(hashObject);

const resultByFirstKey = (keysArray.filter((key) => regByFirstKey.test(key)))[0];
const resultBySecondKey = (keysArray.filter((key) => regBySecondKey.test(key)))[0];

resultByFirstKey ? console.log(hashObject[resultByFirstKey].value) : undefined;
resultBySecondKey ? console.log(hashObject[resultBySecondKey].value) : undefined;

答案 7 :(得分:-1)

/**
 * type Keys = 'key1' | 'key2';
 * const twoKeysMap = new Map<Keys, number>();    
 */
const twoKeysMap = new Map<'key1' | 'key2', number>();

twoKeysMap.set('key1', 1); // -> ok
twoKeysMap.set('key2', 2); // -> ok
twoKeysMap.set('key3', 3); // -> error