代码之家  ›  专栏  ›  技术社区  ›  Naomi

在指定位置复制对象数组中的对象

  •  -2
  • Naomi  · 技术社区  · 6 年前

    我读过一些类似问题的答案,但它们似乎与我的问题不完全相符。我有很多东西。我试图创建一个项的副本并将其插入到某个位置,但它不起作用,当我在调试器中查看数组时,我看到元素的第一个项现在具有priKey=0。

    在插入新项目之前,我在元素中有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();
        }

    1 回复  |  直到 6 年前
        1
  •  0
  •   Naomi    6 年前

    我开始工作了,因为我怀疑问题出在正确克隆这个对象上。这是我当前的代码,它可以满足我的需要(在我的快速测试中)。我很感激你的建议:

    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();
        }