我已经阅读了一些类似问题的答案,但它们似乎与我的问题并不完全匹配。我有一个对象数组。我试图创建一个项目的副本并将其插入某个位置,但是它不起作用,当我在调试器中查看数组时,我看到了元素现在具有priKey =0。
我怀疑我遇到了引用相同项目的问题,而没有进行真正的克隆,这就是为什么我最终使用第一个元素priKey = 0的原因。
在插入新项目之前,我在elementsToInsert中有26个项目:
{priKey: 170, internlPo: 7, department: "RETAIL ", category: "WINTERGEAR", item: "BOOTS-SALO"}
{priKey: 171, internlPo: 7, department: "RETAIL ", category: "WINTERGEAR", item: "BOOTS-SALO"}
{priKey: 172, internlPo: 7, department: "RETAIL ", category: "WINTERGEAR", item: "BOOTS-SALO"}
我的对象具有更多属性,我只展示其中一些。
这是我当前的代码,我试图找出问题出在哪里:
/**
* Copy line item (either all matrix items for this itemId or just that matrix item)
* */
purchaseOrdersCrudController.prototype.copyLineItem = function (lineItem, index, copyAll) {
const self = this;
let elementsToInsert = [];
_.forEach(self.model.lineItems, function (value, key) {
if (value.itemId === lineItem.itemId) {
if (copyAll || key === index) {
elementsToInsert.push(value); // new elements to insert
}
}
});
let i, startPos;
let len = elementsToInsert.length;
startPos = index + len;
for (i = 0; i < len; i++) {
elementsToInsert[i].priKey = 0;
elementsToInsert[i].qtyRcvd = 0;
self.model.lineItems.splice(startPos + i, 0, elementsToInsert[i]); // Insert new element
}
// Re-number
let rn = 0;
len = self.model.lineItems.length;
for (i = 0; i < len; i++) {
if (self.model.lineItems[i].itemId === lineItem.itemId) {
rn++;
if (self.model.lineItems[i].inventId === 0) {
self.model.lineItems[key].rowNumber = 1;
}
else {
self.model.lineItems[key].rowNumber = rn; // Make sure the row number is in sequence
}
}
};
this.form.$setDirty();
}
该代码的想法是复制一个项目。如果在我的界面中单击“标题”行,我想复制itemId等于所选项目itemId的所有项目,并将它们全部插入到该特定itemId的最后一个项目之后(我可能有几个项目)。如果单击“常规”行,我只想复制该行并将其插入到当前行的正下方,然后为该itemId重新编号其余项。我正在努力使该代码正常工作,却看不到我的错误所在。
答案 0 :(得分:0)
我使它起作用,因为我怀疑问题出在正确克隆对象上。这是我当前的代码,可以满足我的需要(在我的快速测试中)。我很乐意提出改进建议:
purchaseOrdersCrudController.prototype.copyLineItem = function (lineItem, index, copyAll) {
const self = this;
let elementsToInsert = [];
let newElement = {};
_.forEach(self.model.lineItems, function (value, key) {
if (value.itemId === lineItem.itemId) {
if (copyAll || key === index) {
newElement = Object.assign({}, value);
newElement.priKey = 0;
newElement.qtyRcvd = 0;
elementsToInsert.push(newElement); // new elements to insert
}
}
});
let i, startPos;
let len = elementsToInsert.length;
startPos = index + len;
for (i = 0; i < len; i++) {
self.model.lineItems.splice(startPos + i, 0, elementsToInsert[i]); // Insert new element
}
// Re-number
let rn = 0;
len = self.model.lineItems.length;
for (i = 0; i < len; i++) {
if (self.model.lineItems[i].itemId === lineItem.itemId) {
rn++;
if (self.model.lineItems[i].inventId === 0) {
self.model.lineItems[i].rowNumber = 1;
}
else {
self.model.lineItems[i].rowNumber = rn; // Make sure the row number is in sequence
}
}
};
this.form.$setDirty();
}