我有 2 個物件,我想將值從一個物件“移植”到另一個物件中。
我從中繪制資料的第一個物件如下所示:
var userData = {
Data: [
{
Amount: 430140.68,
Year: "2015",
AccountName: "Account 1"
},
{
Amount: 458997.32,
Year: "2016",
Name: "Account 2"
},
]
}
我將資料放入的第二個物件如下所示:
[
{
"name": "Account 1",
"data": [
0,
0
],
},
{
"name": "Account 2",
"data": [
0,
0
],
}
]
我的目標是采用Amount第一個物件的形式并將其放入第二個物件的data陣列中。每一年對應于 'data' 陣列中的一個值。
因此,生成的更新物件應如下所示:
[
{
"name": "Account 1",
"data": [
430140.68,
0
],
},
{
"name": "Account 2",
"data": [
0,
458997.32
],
}
]
為了實作這一點,我有以下代碼:
const yearArrLength = yearsArr.length;
const generatedObj = new Array(yearArrLength).fill(0);
// Push name and populate data array with 0s.
for (var key of Object.keys(userData.Data)) {
var accName = userData.Data[key].AccountName;
if (!generatedObj.find(key => key.name === accName)){
generatedObj.push({'name': accName, 'data': blankDataArr});
}
}
for (var key of Object.keys(userData.Data)) {
var accName = userData.Data[key].AccountName;
var accAmount = userData.Data[key].Amount;
var accYear = userData.Data[key].Year;
// Get location of years array value
var yearArrIndex = yearsArr.indexOf(accYear);
for (var key of Object.keys(generatedObj)) {
if (generatedObj[key].name == accName) {
generatedObj[key].data[yearArrIndex] = accAmount;
}
}
}
但是,這似乎填充了所有資料陣列值,例如:
[
{
"name": "Account 1",
"data": [
430140.68,
458997.32
],
},
{
"name": "Account 2",
"data": [
430140.68,
458997.32
],
}
]
我完全不知道為什么。該if陳述句應該檢查是否有匹配的帳戶名稱,但它似乎沒有觸發。
有誰知道我做錯了什么?
uj5u.com熱心網友回復:
看起來您blankDataArr每次都在推送完全相同的內容- 您不是在推送新陣列,而是將同一個陣列推送給所有人。
一個更小的例子:
const subarr = [];
const arr = [subarr, subarr];
arr[0].push('x');
console.log(JSON.stringify(arr));
// both items in `arr` have changed
// because both refer to the exact same subarr object
對于您正在嘗試做的事情,看起來首先將物件或 Map 編入索引要容易得多AccountName,這樣您只需AccountName在迭代時訪問或創建屬性,并分配給適當的年份。
const yearsArr = ['2015', '2016'];
const userData = {
Data: [
{
Amount: 430140.68,
Year: "2015",
AccountName: "Account 1"
},
{
Amount: 458997.32,
Year: "2016",
AccountName: "Account 2"
},
]
};
const dataByAccountName = new Map();
for (const { AccountName, Amount, Year } of userData.Data) {
if (!dataByAccountName.has(AccountName)) {
// Create an entirely new array:
dataByAccountName.set(AccountName, yearsArr.map(() => 0));
}
const index = yearsArr.indexOf(Year);
dataByAccountName.get(AccountName)[index] = Amount;
}
const result = [...dataByAccountName.entries()].map(([name, data]) => ({ name, data }));
console.log(result);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/355610.html
標籤:javascript 查询
