[英]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.reduce
按tag
對數據進行分組,並使用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);
你也可以用
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.