2013-08-28 112 views
2

我有一个较少的理想情况,我不能更改函数的签名,但需要让它在其输出中传递其他信息以用于新功能。将元数据附加到数组

这可以吗?

q = [ 1 , 2 ,3] 
q.meta-data = {additional:'information'} 

这是只分配给q?
这对其他数组对象有任何影响吗?
有没有这种情况会导致某些事情崩溃或者会继续正常运作?

回答

3

不,它不会为其他数组分配任何东西 - 因为您在这里使用特定的对象,而不是其原型。

但是,是的,在某些情况下会咬你。例如,其他一些开发人员可能会认为使用for-in循环迭代存储在q中的Array是个聪明的想法。

+0

关于for-in循环, http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-such-a-bad-idea?rq=1 – Wex

+1

@Wex是的,绝对。但不幸的是,有些人从不学习。 – raina77ow

3

为什么不把数据和元数据分成两个属性?

q = { 
    data: [1, 2, 3], 
    'meta-data': { additional: 'information' } 
}; 
+1

这是一个更好的主意,假设他可以重组他的数据! :-) –

+0

问题是它需要一个任意数量的数组作为参数并对它们进行迭代实现超出了我们的范围,所以传递任何东西都会使整个事情变得模糊 – Prospero

1

如果您将属性分配给q,那只会影响只需q。其他阵列会很好。

如果您使用for..in来循环访问数组,则使用此方法的唯一问题是。只要你只用循环的“普通”for循环或.forEach(你应该这样做),你就不应该有任何问题。

P.S. q.meta-data是一个语法错误(-)。您需要执行q.metadata(或q.meta_data)或q['meta-data']

1

其他答案很好,但你也可以将数组转换为“类似数组”的对象。

objq = {}; 
q.forEach(function (elem, idx) { 
    objq[idx] = elem; 
}); 
objq.length = q.length; 
objq["meta-data"] = {additional: "information"}; 

objq没有阵列的方法,但你可以给他们打电话:

Array.prototype.forEach.call(objq, function (elem) { console.log(elem); }); 
+0

只需记住在添加到它时更新'.length' :) –

+0

@RocketHazmat或者你可以使用'Array.prototype.push.call' –

+0

是的,是的。刚刚想到我会指出:) –

0

我个人不喜欢添加属性阵列,因为这会产生意想不到的后果。我可能会添加一个作为输出参数的附加参数。像这样:

function cantChangeReturn(arg1, arg2, optionalOutputArg) { 
    // do stuff 
    if (optionalOutputArg) { 
    optionalOutputArg.extraResult = extraResult; 
    } 
    return result; 
} 

这样,额外的数据不会泄漏到程序的其他部分,不需要它,也不期望它。