对象数组使用键名是否不好?(混合关联数组风格)

3
在最近的项目中,我需要有序条目以及集合的特殊类型属性,这就是我最终得到的代码:
var array=['a','b'];
array.type = 'alphabet';

console.log(array);
//["a", "b", type: "alphabet"] 

到目前为止,它运作良好,

我没有找到关于这种类型数组的太多文档,请问这种设计有什么缺点吗?


@deceze 这只是一个简化的例子,我正在处理的实际代码是 points = [ [type:'M', [0,0]] , [type:'C', [22,33],[34,42],[66,88] ] ..... ],我需要保持包装数组的顺序。 - maioman
1
@maioman:那会抛出一个语法错误:Uncaught SyntaxError: Unexpected token : - Cerbrus
@Alnitak 哦,好的。抱歉。 - thefourtheye
那个特定的语法一开始就不起作用。你为什么需要一个“type”键和一个顺序?第一个条目总是类型,其余的值跟随吗?那么就不需要“type”键了。有一种明智的方法可以使用标准映射和列表来表达这个数据结构,而不混淆这两个概念。 - deceze
1
@maioman,如果不使用你引用的特定语法,它是无法正常工作的。 - Alnitak
显示剩余5条评论
2个回答

2

这在Javascript范围内可以工作,但要考虑到这个数据结构可能会穿越系统和序列化方案,在其他地方可能就不起作用了。你应该保持你的数据结构“中性”,以一种在多个系统中都能理解的形式存在;使用数组对象数据结构。现在列表映射是普遍被认可的概念,并且得到了所有系统的支持;这两者的混合并不一定适用,而且可能会使你将数据转移到其他系统变得困难。即使你只需要在Javascript中序列化数据(例如存储在cookie中),你也会遇到问题。

你应该简单地用一个同样有效且普遍被理解的格式来表达你的数据:

{ type: 'alphabet', values: ['a', 'b'] }

如果需要进行某种序列化,那么你是正确的。换句话说,是否使用这样的数据结构取决于用例。 - Cerbrus
没错,但实际上你不能总是预测到你会在哪里使用它。你的应用程序可能会不断增长和扩展,突然出现序列化的需求,但此时你已经把自己限制在了一个角落里。如果你按照文档API规范编写并使用预期的数据结构,那么你可能会遇到的困境就会少得多。 - deceze
并不是每个项目都必须可扩展。我并不反对你的观点。我只是想说,在某些情况下,这种结构是完全有效的。 - Cerbrus
你关于序列化的观点是完全正确的(这是我没有考虑到的一个方面)。 - maioman
就性能而言,我测试了混合数组和嵌套数组对象;有趣的是浏览器的结果出现了差异(在Chrome上,混合数组的表现比嵌套数组更快10%,而在Firefox上则慢了30%;让我惊讶的是,Firefox总体上表现更好)。如果你愿意看一下 - maioman

1
技术上讲,这是可行的。如果满足您的需求,我真的不明白为什么您不使用它。
但是,请记住以下几点:
JSON.stringify无法字符串化这些属性,并且只有在使用for...in时,for循环迭代数组才会捕获这些属性:

var array = ['a','b'];
array.type = 'alphabet';

document.write('JSON.stringify(array)<br/>');
document.write(JSON.stringify(array));

document.write('<br/><br/>for in:<br/>');
for(var a in array)
    document.write(a + ': ' + array[a] + '<br/>'); // Will show `type`

document.write('<br/>"normal" for loop:<br/>')
for(var i = 0; i < array.length; i++)
    document.write(i + ': ' + array[i] + '<br/>'); // Will not show `type`

这意味着,正如deceze所提到的那样,如果您需要序列化数据,就会遇到问题。
然而,如果不是这种情况,那么这个数据结构就可以很好地工作。

2
JSON.stringify的行为是一个很好的点,但除此之外,是的,这似乎并不比向DOM元素添加自定义属性更糟糕。 - Alnitak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接