我不确定为什么我会收到此错误,因为我的函数中有map变量声明: - (
如果我在代码下面运行:
if (key in map) {
map[key].push(value)
} else {
map[key] = value
}
我的输出将是这样的:
{ url: ['account/43' ],
status: [ '200' ],
headers:
[ 'content-type = application/json',
'content-type = application/text' ],
body: [ '{ name: xyz}' ] }
如果我在函数内部运行下面的代码行,那么代替那个:
map[key] = ["headers", "body"].includes(key)? [value] : value
输出如下所示(字符串中的url / status和数组格式中的headers / body)但它没有取多个标题值,基本上它取代了值。
{ url: 'account/43',
status: '200',
headers: [ 'content-type = application/text' ],
body: [ '{ name: xyz }' ] }
我试图实现这两种条件(首先,url.status应该是字符串格式,header / body应该是数组格式。其次,header或body可以追加/推送多个值,如下面的输出:
{url: 'account/43',
status: '200',
headers:
[ 'content-type = application/json',
'content-type = application/text' ],
body: [ '{ name: xyz }' ] }
这是实际的功能
function processFile(content) {
let map = {}
content.forEach(function(node) {
if (node.startsWith("//")) {
key = node.substring(2, node.length-2).toLowerCase().trim()
return
} else {
value = node
}
if (key in map) {
map[key].push(value)
} else {
map[key] = value
}
map[key] = ["headers", "body"].includes(key)? [value] : value
})
return map
}
ERROR
map[key].push(value)
^
TypeError: map[key].push is not a function
答案 0 :(得分:0)
这是你可以做到的 -
function processFile(content) {
let map = {}
content.forEach(function(node) {
if (node.startsWith("//")) {
key = node.substring(2, node.length - 2).toLowerCase().trim()
return
} else {
value = node
}
if (key in map) {
map[key].push(value)
} else {
map[key] = [value];
}
map[key] = ["headers", "body"].includes(key) ? [value] : value
})
return map
}

答案 1 :(得分:0)
您确保headers
和body
可以使用多个值。但是,根据错误,很明显其他一些密钥也存在重复。
考虑使用这样的函数:
function processFile(content) {
let key;
return content.reduce(
function (map, node) {
if (node.startsWith('//')) {
key = node.substring(2, node.length-2).toLowerCase().trim();
} else if (key) {
if (map[key]) {
if (map[key].push) {
map[key].push(node);
} else {
throw new Error(`Duplicate key ${key} for scalar value`);
}
} else {
map[key] = node;
}
} else {
throw new Error(`Data encountered without a key: ${node}`);
}
return map;
},
{ headers: [], body: [] }
);
}
遇到重复键时会抛出错误,让您有机会进行调试。
我做的其他改进:
reduce()
代替forEach()
。headers
和body
的空数组初始化地图,这样就无需在迭代函数中进行特殊情况测试。key
,之前不必要的是全球性的。map["undefined"]
。答案 2 :(得分:0)
方法push()
属于Array类。
当你这样做时:
map[key] = value
后来打电话:
map[key].push(value)
map[key]
中没有数组。为了在这里推送元素,我们需要在map[key]
中存储一个数组。要这样做,而不是
map[key] = value //element value being stored in map[key]
我们需要做这样的事情:
map[key] = [value] // array containing value in the first position
初始化并存储数组。