gpt4 book ai didi

javascript - 如何将数组转换为集合

转载 作者:行者123 更新时间:2023-12-03 06:32:22 26 4
gpt4 key购买 nike

我有一个与此类似的 .txt 文件。

ID;SubID;No.;Name;Min;Max;Default;Factor;Unit 
101;5;0;Gas flow time;0;100;0.1;10;s
101;30;1;Start speed;20;200;120;1;m/s
;;2;Start current;0;999;1.0;10;A

我使用 npm 包“fs”readFile 导入此 .txt 文件,并使用 CSVToArray 将其转换为数组。在这里您可以找到我用于转换的代码。

function CSVToArray( strData, strDelimiter ){
// Check to see if the delimiter is defined. If not, then default to comma.
strDelimiter = (strDelimiter || ";");

// Create a regular expression to parse the CSV values.
var objPattern = new RegExp(
(
// Delimiters.
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

// Quoted fields.
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

// Standard fields.
"([^\"\\" + strDelimiter + "\\r\\n]*))"
),
"gi"
);


// Create an array to hold our data. Give the array a default empty first row.
var arrData = [[]];
// Create an array to hold our individual pattern
// matching groups.
var arrMatches = null;

// Keep looping over the regular expression matches until we can no longer find a match.
while (arrMatches = objPattern.exec( strData )){

// Get the delimiter that was found.
var strMatchedDelimiter = arrMatches[ 1 ];

// Check to see if the given delimiter has a length (is not the start of string) and if it matches
// field delimiter. If id does not, then we know that this delimiter is a row delimiter.
if (
strMatchedDelimiter.length &&
strMatchedDelimiter !== strDelimiter
){
// Since we have reached a new row of data, add an empty row to our data array.
arrData.push( [] );
}
var strMatchedValue;
// Now that we have our delimiter out of the way, let's check to see which kind of value we
// captured (quoted or unquoted).
if (arrMatches[ 2 ]){
// We found a quoted value. When we capture this value, unescape any double quotes.
strMatchedValue = arrMatches[ 2 ].replace(
new RegExp( "\"\"", "g" ),
"\""
);
} else {
// We found a non-quoted value.
strMatchedValue = arrMatches[ 3 ];
}
// Now that we have our value string, let's add it to the data array.
arrData[ arrData.length - 1 ].push( strMatchedValue );
}
// Return the parsed data.
return( arrData );

现在我想从 CSVToArray 返回的数组中创建一个名为 Parameter 的集合。该集合应如下所示:

// First entry: 
Parameter = {
ID: 101;
SubID: 5;
No: 0;
//...
}

// Second entry:
Parameter = {
ID: 101;
SubID: 30;
No:1;
//...
}
...

有人知道将数组转换为集合的聪明方法吗?

非常感谢大家!

最佳答案

我建议您保持现有的 CSVToArray 不变,并添加另一个进行最终转换的函数:

function tableToObjectArray(arrData) {
var keys = arrData[0];
return arrData.slice(1).map(function (row) {
return row.reduce(function (obj, val, idx) {
obj[keys[idx]] = val;
return obj;
}, {});
});
}

您可以使用 CSVToArray 的输出来调用它:

var arrData = CSVToArray(input, ';');
var objData = tableToObjectArray(arrData);

这是一个工作片段:

// Original left unchanged:
function CSVToArray( strData, strDelimiter ){
// Check to see if the delimiter is defined. If not, then default to comma.
strDelimiter = (strDelimiter || ";");

// Create a regular expression to parse the CSV values.
var objPattern = new RegExp(
(
// Delimiters.
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
// Quoted fields.
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
// Standard fields.
"([^\"\\" + strDelimiter + "\\r\\n]*))"
),
"gi"
);

// Create an array to hold our data. Give the array a default empty first row.
var arrData = [[]];
// Create an array to hold our individual pattern
// matching groups.
var arrMatches = null;

// Keep looping over the regular expression matches until we can no longer find a match.
while (arrMatches = objPattern.exec( strData )){

// Get the delimiter that was found.
var strMatchedDelimiter = arrMatches[ 1 ];

// Check to see if the given delimiter has a length (is not the start of string) and if it matches
// field delimiter. If id does not, then we know that this delimiter is a row delimiter.
if (
strMatchedDelimiter.length &&
strMatchedDelimiter !== strDelimiter
){
// Since we have reached a new row of data, add an empty row to our data array.
arrData.push( [] );
}
var strMatchedValue;
// Now that we have our delimiter out of the way, let's check to see which kind of value we
// captured (quoted or unquoted).
if (arrMatches[ 2 ]){
// We found a quoted value. When we capture this value, unescape any double quotes.
strMatchedValue = arrMatches[ 2 ].replace(
new RegExp( "\"\"", "g" ),
"\""
);
} else {
// We found a non-quoted value.
strMatchedValue = arrMatches[ 3 ];
}
// Now that we have our value string, let's add it to the data array.
arrData[ arrData.length - 1 ].push( strMatchedValue );
}
// Return the parsed data.
return( arrData );
}

// New function added:
function tableToObjectArray(arrData) {
var keys = arrData[0];
return arrData.slice(1).map(function (row) {
return row.reduce(function (obj, val, idx) {
obj[keys[idx]] = val;
return obj;
}, {});
});
}

// Sample data:
var input = `ID;SubID;No.;Name;Min;Max;Default;Factor;Unit
101;5;0;Gas flow time;0;100;0.1;10;s
101;30;1;Start speed;20;200;120;1;m/s
;;2;Start current;0;999;1.0;10;A`;

// Convert to 2D array
var arrData = CSVToArray(input, ';');
// Convert to object array
var objData = tableToObjectArray(arrData);
// Output result:
console.log(objData);

关于javascript - 如何将数组转换为集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38392180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com