2017-04-05 140 views
0

我有一个数组:将元素添加到阵列调用

 var cells = [ 
      [1, 2, 3], 
      [4, 5, 6], 
      [7, 8, 9] 
     ]; 

我的JavaScript代码解析此阵列和绘制为表。

现在我想添加的功能,以简化添加行和单元格表,所以我开始使用此代码:

Array.prototype.tsoAddRow = function() { 
    this.push([]); 
    return this[this.length-1]; 
}; 


Array.prototype.tsoAddCell = function (value) { 
    this.push(value); 
}; 

cells.tsoAddRow().tsoAddCell("123"); 

它正常工作,结果是Array [ Array[1] ]但我需要更多。

我怎样才能改善这种功能,所以我能够IKE在此使用它们:

cells.tsoAddRow().tsoAddCell("1").tsoAddCell("2").tsoAddCell("3") 
.tsoAddRow().tsoAddCell("4").tsoAddCell("5").tsoAddCell("6") 
.tsoAddRow().tsoAddCell("7").tsoAddCell("8").tsoAddCell("9") 

或者类似的链式方式。表可以是复杂得多,例如,在这里另一种:

 cells = [ 
      [ 
       "Lorem ipsum", 
       "Lorem ipsum2", 
       [ 
        ["111", "222"] 
       ] 
      ], 
      [ 
       "Lorem ipsum1", 
       "Lorem ipsum12" 
      ], 
      [ 
       "Lorem ipsum2", 
       "Lorem ipsum22" 
      ], 

更新1:

谢谢到@binariedMe我有溶液,这里替代为阵列上方,但是与仅使用链功能:

 cells 
      .tsoAddRow() 
       .tsoAddCell("Lorem ipsum") 
       .tsoAddCell("Lorem ipsum") 
       .tsoAddCell(
        new Array().tsoAddRow() 
         .tsoAddCell("111") 
         .tsoAddCell("222") 
        ) 
      .tsoAddRow() 
       .tsoAddCell("Lorem ipsum1") 
       .tsoAddCell("Lorem ipsum12") 
      .tsoAddRow() 
       .tsoAddCell("Lorem ipsum2") 
       .tsoAddCell("Lorem ipsum22"); 
+0

传递数组作为参数,并推送到该数组 – AurA

+0

_“现在我想添加函数来简化向表添加行和单元格”_并且因此你搞乱了'Array'原型? O.o – Andreas

+0

预期结果是什么? – guest271314

回答

3

使此功能tsoAddCell

Array.prototype.tsoAddCell = function (value) { 
    this.length && this[this.length-1].push(value); return this; 
}; 

而且使tsoAddRow功能是这样的:

Array.prototype.tsoAddRow = function() { 
    this.push([]); 
    return this; 
}; 

说明:

增加细胞应在最后添加的行,但我们所需要的链都做每次返回原始数组,以便我们可以在其上执行下一个任务。 因此你需要从每个函数中返回这个。

+0

你应该记住的唯一事情就是你必须在添加行之后添加单元格,并且单元格将被添加到最后一行,只有在问题中提到。 – binariedMe

+0

为@RobG添加了相同的解释:) – binariedMe

+1

感谢它的工作! –

0
Array.prototype.tsoAddCell = function (value) { 
    var _this = this; 
    value.forEach(function(i) { 
     _this.push(i); 
    }) 
}; 

cells.tsoAddRow().tsoAddCell([1,2,3,4,5,6,7]); 

我希望这可以帮助你

0

如果您确实需要方法链接,就像您在请求中描述的那样,则还需要从tsoAddCell方法返回当前数组。所以

Array.prototype.tsoAddCell = function (value) { 
    this.push(value); 
    return this; 
}; 

但我怀疑这会给你你所期望的灵活性,因为它只会让你当前的阵列中创建嵌套的数组,而不是例如当前行的新兄弟姐妹一行。

如果您想要更大的灵活性,您可以结合我的答案和Vasilij的答案。如果你需要更大的灵活性,你应该提供另一种方法来允许选择当前数组的父数组。但是,您需要跟踪该父数组。喜欢的东西:

Array.prototype.tsoAddRow = function() { 
    this.push([]); 
    var row = this[this.length-1]; 
    row.parent = this; 
    return row; 
}; 

Array.prototype.parent = function() { 
    return this.parent; 
} 

那么您的要求将成为类似:

cells.tsoAddRow().tsoAddCell("1").tsoAddCell("2").tsoAddCell("3") 
.parent().tsoAddRow().tsoAddCell("4").tsoAddCell("5").tsoAddCell("6") 
.parent().tsoAddRow().tsoAddCell("7").tsoAddCell("8").tsoAddCell("9"); 

然后作为改善您可以添加一些逻辑来tsoAddRow检查父自己,这样就可以避免明确调用parent()。但是,这当然只在你只需要构造一个2维数组的时候很有用。如果你需要更多维度,你的API将需要扩展。