簡體   English   中英

Javascript。 你如何創建一個創建對象的循環,然后將這些對象推入一個數組?

[英]Javascript. How do you make a loop that creates objects, then those objects being pushed into an array?

所以我開始導入 4 個具有等量數據的不同數組。

然后我做了一個類,認為這個類可以幫助我用導入的數據制作對象。

所以我的想法是,如果我遍歷那個類,它可以創建一個包含所有 4 個數組的數據的對象,然后將該對象推入一個數組。

我希望objectArray 的最終結果看起來像......

[ {nn: "Lion", dat1: 4, dat2: 9, dat3: 10}, {nn: "Zebra", dat1: 5, dat2: 10, dat3: 7}, {nn: "Monkey", dat1: 2, dat2: 6, dat3: 14} ...etc. ]

 // mock const threeToType = { name: ["Lion", "Zebra", "Monkey"], data1: [ 4, 5, 2], data2: [ 9, 10, 6], data3: [ 10, 7, 14], }; const {name, data1, data2, data3} = threeToType; // require('./threeToType'); let objectArray = []; class makeObj{ constructor(nn, dat1, dat2, dat3){ this._nn = nn; this._dat1 = dat1; this._dat2 = dat2; this._dat3 = dat3; } } for(let newObj, i = 0, tN = "", tD1 = 0, tD2 = 0, tD3 = 0; i<name.length; i++){ tN = name[i]; tD1 = data1[i]; tD2 = data2[i]; tD3 = data3[i]; objectArray.push(newObj = new makeObj(tN, tD1, tD2, tD3)); } console.log(objectArray);

為什么不簡單地:

const {name, data1, data2, data3} = require('./threeToType');
let objectArray = []
for (let i = 0; i < name.length; i++) {
  let newItem = { nn: name[i], tD1: data1[i], tD2: data2[i], td3: data3[i] }
  objectArray.push(newItem)
}

從/以您希望的方式獲取您的nameArrdata1Arrdata2Arrdata3Arr - 我已經使用了一些數據作為片段。

map使用它們的索引(此處為idx )迭代 Array 中的項目(此處為cv ,未使用)。
我們使用該idx從所有數組中檢索“並行”項並從中創建一個對象。
我們用括號( () )包圍對象,因為它被返回,我們不希望瀏覽器認為它是代碼( return是一個函數,但我們可以省略括號,在這里 - 我們使用它們) .

 nameArr=["Zebra", "Lion", "Elephant"]; data1Arr=[23, 12, 40]; data2Arr=["Africa", "America", "India"]; data3Arr=[true, false, true]; objArr=nameArr.map((cv, idx)=>({ name:nameArr[idx], data1:data1Arr[idx], data2:data2Arr[idx], data3:data3Arr[idx] })); console.log(objArr);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

這是一個更通用的解決方案,假設您的輸入數組基本上是表的行(因為它們都具有相同的長度),並且您想“翻轉”或將它們反轉為列。 基本上是一個二維數組。

我會在這個算法中保留輸入數組的名稱。 沒有簡單的方法可以在 JS 中將變量的名稱(如代碼段中的“data1”)作為字符串獲取。

順便說一句,您可以使用任意數量的數組調用它,只要它們都具有相同的長度。

const invertRows = (...rows) => {
    const numRows = rows.length;
    const numColumns = rows[0].length;

    const inverted = new Array(numColumns);
    for (let col=0; col < numColumns; col++) {
        inverted[col] = new Array(numRows);
        for (let row=0; row < numRows; row++) {
            inverted[col][row] = rows[row][col];
        }
    }
    return inverted;
};

const arr1 = [1,2,3];
const arr2 = [3,4,5];

console.log(invertRows(arr1, arr2));

// Returns: [ [ 1, 3 ], [ 2, 4 ], [ 3, 5 ] ]

我目前不確定您在問什么,您當前的解決方案確實有效。

這是轉換數據結構的通用解決方案:

// from
const columns = {name: ["John Doe", "Jane Doe"], age: [42, 39]};
// into
const rows = [{name: "John Doe", age: 42}, {name: "Jane Doe", age: 39}];
// and the other way around.

 const threeToType = { name: ["Lion", "Zebra", "Monkey"], data1: [ 4, 5, 2], data2: [ 9, 10, 6], data3: [ 10, 7, 14], }; function columnsToRows(columns) { columns = Object.entries(columns); if (columns.length == 0) return []; const colLengths = columns.map(([,values]) => values.length); const maxColLength = Math.max(...colLengths); return Array.from({length: maxColLength}, (_, i) => { const row = Object.create(null); columns.forEach(([colName, values]) => row[colName] = values[i]); return row; }); } function rowsToColumns(rows) { if (rows.length == 0) return {}; const columns = Object.create(null); const colNames = new Set(rows.flatMap((row) => Object.keys(row))); colNames.forEach((colName) => columns[colName] = []); rows.forEach((row) => { colNames.forEach((colName) => columns[colName].push(row[colName])); }); return columns; } console.log(columnsToRows(threeToType)); console.log(rowsToColumns(columnsToRows(threeToType)));

暫無
暫無

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

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