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

时间:2018-08-13 20:58:30

标签: javascript arrays angularjs object

我已经阅读了一些类似问题的答案,但它们似乎与我的问题并不完全匹配。我有一个对象数组。我试图创建一个项目的副本并将其插入某个位置,但是它不起作用,当我在调试器中查看数组时,我看到了元素现在具有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重新编号其余项。我正在努力使该代码正常工作,却看不到我的错误所在。

1 个答案:

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