JavaScript对象 - 根据上下文的不同类型

时间:2014-11-01 09:24:49

标签: javascript

我首先要说我不认为这是可能的,但希望有人知道JavaScript中有一些特殊方法可以做到这一点。我有一个JavaScript对象定义如下:

var t = {
  "fields": {
    "a": ["99", "98"]
  }
};

我正在寻找一种方法,以便我可以使用不同的值定义数组的相同元素两次,这些值可以在两个不同的上下文中使用 - 如下所示:

var t = {
  "fields": {
    "a": ["99", "98"],
    "a": "99|98"
  }
};

如果我使用语法t.fields["a"]查询它,它将返回“99 | 98”,但如果我使用t.fields["a"][0]查询它,那么它将返回“99”。我理解如果我在没有指定索引的情况下查询数组,那么它会返回“99,98”作为字符串 - 但我需要它返回用“|”分隔的条目而不是“,”。

3 个答案:

答案 0 :(得分:3)

也可以使用getter函数,如下所示:

var t = {
    "fields": {
        "_a": ["99", "98"],
        "a": function (index) {
            if (typeof index != 'undefined')
                return this._a[index];
            else
                return this._a.join('|');
        }
    }
};

console.log(t.fields['a']()); // 99|98
console.log(t.fields['a'](1));// 98

您还可以为所有字段设置全局get函数:

var t = {
    "fields": {
        "_a": ["99", "98"],
        get: function (field, index) {
            if (typeof index != 'undefined')
                return this['_' + field][index];
            else
                return this['_' + field].join('|');
        }
    }
};

console.log(t.fields.get('a')); // 99|98
console.log(t.fields.get('a', 1)); // 98

答案 1 :(得分:2)

为了实现你想要的,你有一些选择。根据您的编码风格,环境等,选择最适合您的选项。您好。

选项1

您可以轻松替换.toString()的{​​{1}}方法,以返回由垂直线(Array.prototype)分隔的值,而不是通常的逗号。你可以这样做:

|

现在你可以轻松地做你想做的事了:

Array.prototype.toString = function() {
    return this.join("|");
};

顺便说一句,更改默认对象'方法/属性并不总是最佳选择,因为某些库或本机方法可能会使用它们并导致错误,因为它们已被修改。

选项2

要实现您想要的效果,如果您只需要使用几个数组,则可以修改其var t = { "fields": { "a": ["99", "98"] } }; console.log("My array is: " + t.fields); // My array is: 99|98 console.log("Its first element is: " + t.fields[0]); // Its first element is: 99 而非默认prototype,如下所示:

Array.prototype

如果您只使用少数数组,这是一种更好的方法,否则更改您使用的每个数组的每个原型都会很重,并且最好使用// Let's assume you have arrays a, b and c var a = [1, 2], b = [3, 4], c = [5, 6]; a.toString = b.toString = c.toString = function() { return this.join("|"); }; (就像我的第一个示例)。< / p>

选项3

构建自己的功能并使用它。这是推荐,因为它不会更改任何现有的Array.prototype方法,这可能会导致一些错误,具体取决于您使用数组的方式。

prototype

答案 2 :(得分:0)

请关闭此功能,感谢@ marco-bonelli和其他所有我已满足以下内容的人:

var t = {
  "fields": {
    "a": ["99", "98"],
    "b": ["77", "76"]
  },
  "token": "|"
};

Object.keys(t).forEach(function(key) {
  t.fields[key].toString = function() {
    return this.join(t.token);
  };
});

“t”对象是从用户数据动态生成的(小心转义),因此“fields”对象中可能有多个元素。