Javascrpt,我们如何创建一个对象,在创建两个数组之前遍历两个数组,它们是键/值对?



我有一个疑问:

我正在尝试解析一个文件,该文件的内容是两行,将数据保存为:

'Head' 'Heart' 'Hand'
"0 255 5" "100 1 5" "0 55 155"

第一行是身体部位的列表,第二行是每个身体部位灰度的列表。

需要创建一个对象,例如:

atlas = {
firstName = grayLevel1,
secondName = grayLevel2,
...
};

那么我们将有:

atlas = {
Head = 0 255 5,
Heart = 100 1 5,
Hand = 0 55 155,
...
};

我刚刚设法阅读了所有文件,隔离了行和单词。

为此,我写了:

readTextFile("columna01-es-latin1.txt");
function readTextFile(file) {
var rawFile = new XMLHttpRequest();
rawFile.open("GET", file, false);
rawFile.onreadystatechange = function () {
if (rawFile.readyState === 4) {
if (rawFile.status === 200 || rawFile.status == 0) {
allText = rawFile.responseText;
console.log('The complete text is', allText);
let lineArr = intoArray(allText);
let firstLineWords = intoWords(lineArr[0]);
let secondLineWords = intoWords(lineArr[1]);
console.log('Our  first line is: ', lineArr[0]);
for (let i = 0; i < firstLineWords.length; i++) {
console.log(`Our ${i} word in the first line is : ${firstLineWords[i]}`);
console.log(`Our ${i} word in the SECOND line is : ${secondLineWords[i]}`);
}

}
}
}
rawFile.send(null);
}
function intoArray(lines) {
// splitting all text data into array "n" is splitting data from each new line
//and saving each new line as each element*
var lineArr = lines.split('n');
//just to check if it works output lineArr[index] as below

return lineArr;

}
function intoWords(line) {

var wordsArr = line.split('" "');

return wordsArr;
}

为了能够创建对象,我会做如下的事情:

let atlas = {
for(let i = 0; i < firstLineWords.length; i++){
firstLineWords[i]: secondLineWords[i]
}
};

但是,它不是有效的语法。

我会将上一个任务执行到 readTextFile() 中

function readTextFile(file) {
var rawFile = new XMLHttpRequest();
rawFile.open("GET", file, false);
rawFile.onreadystatechange = function () {
if (rawFile.readyState === 4) {
if (rawFile.status === 200 || rawFile.status == 0) {
allText = rawFile.responseText;
console.log('The complete text is', allText);
let lineArr = intoArray(allText);
let firstLineWords = intoWords(lineArr[0]);
let secondLineWords = intoWords(lineArr[1]);
console.log('Our  first line is: ', lineArr[0]);
for (let i = 0; i < firstLineWords.length; i++) {
console.log(`Our ${i} word in the first line is : ${firstLineWords[i]}`);
console.log(`Our ${i} word in the SECOND line is : ${secondLineWords[i]}`);
}
let atlas = {
for(let i = 0; i < firstLineWords.length; i++){
firstLineWords[i]: secondLineWords[i]
}
};
}
}
}
rawFile.send(null);
}

我知道在对象内部,我们无法循环访问尚未创建的属性。😖

我还读过:

如何循环访问对象属性:循环访问对象属性

将对象签入数组:

如何检查数组是否包含 JavaScript 中的对象?

循环思想对象:如何循环或枚举 JavaScript 对象?

动态地将键/值对添加到对象,这是一个非常接近的主题,但是我看不出它如何应用于此示例,😳✖:

如何将键/值对添加到 JavaScript 对象?

如何迭代到普通的Javascript对象: 如何循环使用对象作为成员的普通JavaScript对象?

JavaScript 键值对:JavaScript 对象键值对

我们如何在对象内部处理这种键/值创建?

我相信这可以解决您的问题:

var atlas = {};
for(var i = 0 ; i < bodyParts.length ; i++{
atlas[bodyParts[i]] = grayLevel[i]
}

Javascript 检查该键是否存在于 atlas 中,如果不存在,它会创建它并分配相应的 greyLevel 值。

这是你要找的吗?您可以将数组简化为单个对象,其键/值对等于正文部分及其各自的灰度级别,如下所示:

var bodyParts = ['Head', 'Heart', 'Hand'];
var grayLevels = ["0 255 5", "100 1 5", "0 55 155"];
var atlas = bodyParts.reduce(function (res, curr, index) {
res[curr] = grayLevels[index];
return res;
}, {});
console.log(atlas);

拆分行,并使用Array.map()获取所需的两个文本数组。然后使用Array.reduce()将它们组合到一个对象中:

const text = `'Head' 'Heart' 'Hand'
"0 255 5" "100 1 5" "0 55 155"`;
const txtToObj = (txt) => {
const [l1, l2] = text.split('n')
.map((l) => l.match(/b[^'"]+/g));

return l1.reduce((r, w, i) => {
r[w] = l2[i];

return r;
}, {});
};
console.log(txtToObj(text));

最新更新