簡體   English   中英

我有一個數組,我需要使用 object 映射將其推入新數組

[英]I have an Array I need to push into new Array with object mapping

這是我的數組:

[
    {
        "batchno": "B-PI1-1",
        "unitId": 341,
        "productName": "Bar Soap",
        "productProfileId": 3950,
        "qty": 148,
        "returnQty": "20",
        "rate": 10,
        "salesRate": 20,
        "unitName": "PC",
        "gross": 200,
        "net": 200,
        "remarks": "sxzxz"
    },
    {
        "batchno": "B-PI4-1",
        "unitId": 341,
        "productName": "Biscuit",
        "productProfileId": 3951,
        "qty": 700,
        "returnQty": "20",
        "rate": 10,
        "salesRate": 60,
        "unitName": "PC",
        "gross": 200,
        "net": 200,
        "remarks": "zxzxzx"
    }
];

我需要推入一個新數組,但最后一個被雙推:

if (this.primengTableHelper.initialRecords.length > 0) {
    this.primengTableHelper.initialRecords.map((item: any) => {
        console.log('item', item);
        this.singleItem.batchNo = item.batchno;
        this.singleItem.unitId = item.unitId;
        this.singleItem.productName = item.productName;
        this.singleItem.productProfileId = item.productProfileId;
        this.singleItem.qty = item.qty;
        this.singleItem.returnQty = item.returnQty
        this.singleItem.rate = item.rate;
        this.singleItem.salesRate = item.salesRate;
        this.singleItem.unitName = item.unitName;
        this.singleItem.gross = item.net;
        this.singleItem.net = item.net;
        this.singleItem.remarks = item.remarks;
        this.createOrEditDamageStockDto.paymentNO = this.voucherNO;
        this.createOrEditDamageStockDto.invoiceDate = 
            this.maxInvoiceDateFilter.toString();
        this.createOrEditDamageStockDto.damageStockDetailsListDto
            .push(this.singleItem);
    });

無論進行多少次迭代,您都繼續推動this.singleItem ,它是一個object。 在每次迭代中,單個 object 都會發生變異,然后再次推送,從而導致對同一 object 的多個引用。

相反,請確保在每次迭代中創建一個的 object。 同時避免所有這些單獨的分配,而是使用擴展語法:

        const newItem = {...this.singleItem, ...item};
        // Make other changes to `newItem` properties if needed...
        // ...
        // Push the new object:
        this.createOrEditDamageStockDto.damageStockDetailsListDto
            .push(newItem);

不是你的問題,但以下幾行在循環中沒有意義,因為它們不依賴於迭代的item

    this.createOrEditDamageStockDto.paymentNO = this.voucherNO;
    this.createOrEditDamageStockDto.invoiceDate = 
        this.maxInvoiceDateFilter.toString();

這些語句將始終在每次迭代中進行相同的分配。 所以把它們放在那個循環之外。

請注意,當您不使用結果時,不應使用.map 然后只需使用.forEach 另一方面,您可以使用.map創建一個數組以分配給this.createOrEditDamageStockDto.damageStockDetailsListDto 在您的情況下這是否是一個好主意,取決於該數組在循環之前是否已經存在,並且是否具有應該保留在那里的內容。

我不確定我是否理解這個問題。 您有一個包含兩個對象的數組。 您是否只是想要一個包含三個對象的新數組,其中最后一個 object 與第二個相同? 如果是這樣,您可以使用 ES6 擴展運算符並執行以下操作:

const initialRecords = [
  {
    "batchno": "B-PI1-1",
    "unitId": 341,
    "productName": "Bar Soap",
    "productProfileId": 3950,
    "qty": 148,
    "returnQty": "20",
    "rate": 10,
    "salesRate": 20,
    "unitName": "PC",
    "gross": 200,
    "net": 200,
    "remarks": "sxzxz"
  },
  {
    "batchno": "B-PI4-1",
    "unitId": 341,
    "productName": "Biscuit",
    "productProfileId": 3951,
    "qty": 700,
    "returnQty": "20",
    "rate": 10,
    "salesRate": 60,
    "unitName": "PC",
    "gross": 200,
    "net": 200,
    "remarks": "zxzxzx"
  }
]

const recordsWithDuplicate = [
  ...initialRecords,
  initialRecords[initialRecords.length - 1]
]

你可以在這里閱讀: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax#spread_in_array_literals

我希望這有幫助:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM