通过链式函数调用向数组添加元素
Adding elements to array via chained functions calls
我有一个数组:
var cells = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
我的 javascript 代码解析这个数组并绘制为 table。
现在我想添加函数来简化向 table 添加行和单元格的过程,所以我从以下代码开始:
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] ]
但我需要更多。
我如何改进这个功能,以便我可以像这样使用它们:
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");
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]);
希望对您有所帮助
为 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;
};
解释:
添加单元格应在添加的最后一行完成,但每次 return 将我们需要的所有内容链接到原始数组,以便我们可以在其上执行下一个任务。
因此,您需要从每个函数中 return 这个。
如果您真的想要方法链接,就像您在请求中描述的那样,您将需要 return 来自 tsoAddCell 方法的当前数组。所以
Array.prototype.tsoAddCell = function (value) {
this.push(value);
return this;
};
但我怀疑这是否会给您带来预期的灵活性,因为它只允许您在当前数组中创建嵌套数组,例如当前行的新同级行。
如果您想要更大的灵活性,可以结合使用我的答案和 Vasilij 的答案。
或者如果您需要更大的灵活性,您应该提供另一种允许 select 当前数组的父数组的方法。但是你需要跟踪那个父数组。类似于:
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()。但这当然只有在您只需要构造一个二维数组时才有用。如果您需要更多维度,您 API 将需要扩展。
我有一个数组:
var cells = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
我的 javascript 代码解析这个数组并绘制为 table。
现在我想添加函数来简化向 table 添加行和单元格的过程,所以我从以下代码开始:
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] ]
但我需要更多。
我如何改进这个功能,以便我可以像这样使用它们:
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");
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]);
希望对您有所帮助
为 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;
};
解释:
添加单元格应在添加的最后一行完成,但每次 return 将我们需要的所有内容链接到原始数组,以便我们可以在其上执行下一个任务。 因此,您需要从每个函数中 return 这个。
如果您真的想要方法链接,就像您在请求中描述的那样,您将需要 return 来自 tsoAddCell 方法的当前数组。所以
Array.prototype.tsoAddCell = function (value) {
this.push(value);
return this;
};
但我怀疑这是否会给您带来预期的灵活性,因为它只允许您在当前数组中创建嵌套数组,例如当前行的新同级行。
如果您想要更大的灵活性,可以结合使用我的答案和 Vasilij 的答案。
或者如果您需要更大的灵活性,您应该提供另一种允许 select 当前数组的父数组的方法。但是你需要跟踪那个父数组。类似于:
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()。但这当然只有在您只需要构造一个二维数组时才有用。如果您需要更多维度,您 API 将需要扩展。