将元数据附加到数组

时间:2013-08-28 17:28:38

标签: javascript arrays

我有一个不太理想的情况,我无法更改函数的签名,但需要在输出中传递其他信息以用于新功能。

这样做可以吗?

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

这只是分配给q吗?
这是否对其他阵列物体产生任何影响?
是否会出现这种情况会破坏或继续正常运作?

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

不,它没有为其他数组分配任何东西 - 因为你在这里处理一个特定的对象,而不是它的原型。

但是,在某些情况下,它会让你感到害怕。例如,其他一些开发人员可能认为用q循环遍历存储在for-in中的数组是个明智之举。

答案 2 :(得分:1)

如果您将属性分配给q,那只会影响 q。其他阵列也没问题。

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

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

答案 3 :(得分: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); });

答案 4 :(得分:0)

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

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

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