簡體   English   中英

從重復數組中填充數組

[英]Populating array from a repeating array

我正在制作一個處理網站翻譯的小工具。 我已經有了這個代碼工作,但我覺得應該有一些更優雅和可讀的方式使用數組方法(我看起來像一團糟......)。

基本上,我將以代碼中顯示的格式輸入(data_import,這只是用於測試的假數據)。 它有4列[translationTag,uniqueId,languageId,translation]。 每種語言的行順序相同,每種語言的行數相同。 語言數量可能會從2向上變化。

所需的輸出將是這樣的:

const data_import =  [

  ['aaa', {id:1, langId:1, finnish:'tuntematon'}, {id:5, langId:4, english:'unknown'}, {id:9, langId:6, swedish:'okänd'}],
  ['bbb', {id:2, langId:1, finnish:'auto'}, {id:6, langId:4, english:'car'}, {id:10, langId:6, swedish:'bil'}],
  ['ccc', {id:3, langId:1, finnish:'polkupyörä'}, {id:7, langId:4, english:'bicycle'}, {id:11, langId:6, swedish:'cykel'}],
  ['ddd', {id:4, langId:1, finnish:'rullalauta'}, , {id:8, langId:4, english:'skateboard'}, {id:12, langId:6, swedish:'skateboard'}]
];

這是我的代碼“有效”但丑陋且難以理解......

export const language = ['Finnish', 'Estonia', 'Polish', 'English', 'Spanish', 'Swedish'];

const data_import =  [
  ['aaa', 1, 1, 'tuntematon'],
  ['bbb', 2, 1, 'auto'],
  ['ccc', 3, 1, 'polkupyörä'],
  ['ddd', 4, 1, 'rullalauta'],
  ['aaa', 5, 4, 'unknown'],
  ['bbb', 6, 4, 'car'],
  ['ccc', 7, 4, 'bicycle'],
  ['ddd', 8, 4, 'skateboard'],
  ['aaa', 9, 6, 'okänd'],
  ['bbb', 10, 6, 'bil'],
  ['ccc', 11, 6, 'cykel'],
  ['ddd', 12, 6, 'skateboard']];

export const data = process_test(data_import);

function process_test(data) {  
  const numberOfCols = data[0].length;
  const idIndex = numberOfCols - 2;
  const arr_result = []
  let rowMax = 0;
  let rowMaxMulti = 0;
  let langIdLast = 0;
  data.forEach((row, index) => {
    // if = add non-language cols and first language column
    if(row[idIndex] === data[0][idIndex]) {
      rowMax = index + 1;
      const transItem = row.slice(0, idIndex-1);
      transItem.push({ id:row[idIndex], langId:row[idIndex], [language[row[idIndex] - 1]]:row[idIndex + 1] });
      arr_result[index] = transItem;
      langIdLast = row[idIndex];
    }
    // add other languages to datarow
    else {
      const transItem = { id:row[idIndex - 1], langId:row[idIndex], [language[row[idIndex] + 1]]:row[idIndex + 1] };
      if(langIdLast !== row[idIndex]) rowMaxMulti++;
      arr_result[index - rowMax * rowMaxMulti].push(transItem);
      langIdLast = row[idIndex];
    }
  })
  return(arr_result);
}

reduce為由轉換標記索引的對象,然后獲取該對象的值會更簡單。 在每次迭代時,如果轉換標記在累加器中不存在,則為其創建一個數組。 從當前項的langId中標識語言名稱,並將新對象push送到數組:

 const language = ['Finnish', 'Estonia', 'Polish', 'English', 'Spanish', 'Swedish']; const data_import = [ ['aaa', 1, 1, 'tuntematon'], ['bbb', 2, 1, 'auto'], ['ccc', 3, 1, 'polkupyörä'], ['ddd', 4, 1, 'rullalauta'], ['aaa', 5, 4, 'unknown'], ['bbb', 6, 4, 'car'], ['ccc', 7, 4, 'bicycle'], ['ddd', 8, 4, 'skateboard'], ['aaa', 9, 6, 'okänd'], ['bbb', 10, 6, 'bil'], ['ccc', 11, 6, 'cykel'], ['ddd', 12, 6, 'skateboard']]; const data = Object.values(data_import.reduce((a, [tTag, id, langId, word]) => { if (!a[tTag]) a[tTag] = [tTag]; const langName = language[langId - 1]; a[tTag].push({ id, langId, [langName]: word }); return a; }, {})); console.log(data); 

您可以使用Array.prototype.reducetag對數據進行分組,並使用Object.keys將其映射到所需的格式

 const language = ['Finnish', 'Estonia', 'Polish', 'English', 'Spanish', 'Swedish']; const data_import = [['aaa', 1, 1, 'tuntematon'],['bbb', 2, 1, 'auto'],['ccc', 3, 1, 'polkupyörä'],['ddd', 4, 1, 'rullalauta'],['aaa', 5, 4, 'unknown'],['bbb', 6, 4, 'car'],['ccc', 7, 4, 'bicycle'],['ddd', 8, 4, 'skateboard'],['aaa', 9, 6, 'okänd'],['bbb', 10, 6, 'bil'],['ccc', 11, 6, 'cykel'],['ddd', 12, 6, 'skateboard']]; const grouped = data_import.reduce((all, [tag, id, langId, tran]) => { if (!all.hasOwnProperty(tag)) all[tag] = []; all[tag].push({id, langId, [language[langId-1]]: tran}); return all; }, {}); const result = Object.keys(grouped).map(tag => [tag, ...grouped[tag]]); console.log(result); 

你也可以用

  1. Array.prototype.map()
  2. Array.prototype.filter()
  3. 新集([])
  4. 解構任務

 const data_import = [["aaa",1,1,"tuntematon"],["aaa",5,4,"unknown"],["aaa",9,6,"okänd"],["bbb",6,4,"car"],["bbb",2,1,"auto"],["bbb",10,6,"bil"],["ccc",11,6,"cykel"],["ccc",7,4,"bicycle"],["ccc",3,1,"polkupyörä"],["ddd",8,4,"skateboard"],["ddd",4,1,"rullalauta"],["ddd",12,6,"skateboard"]], language = ['Finnish', 'Estonia', 'Polish', 'English', 'Spanish', 'Swedish']; const keys =[...new Set(data_import.map(v => v[0]))]; let result = keys.map(key => [key, data_import.filter(v => v[0] == key).map(v => { return { id: v[1], langId: v[2], [language[v[2]-1]]: v[3] } })]); console.log(result) 
 .as-console-wrapper {max-height: 100% !important;top: 0;} 

暫無
暫無

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

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