TypeError:map [key] .push不是函数

时间:2018-06-05 19:22:53

标签: javascript node.js

我不确定为什么我会收到此错误,因为我的函数中有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

3 个答案:

答案 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)

您确保headersbody可以使用多个值。但是,根据错误,很明显其他一些密钥也存在重复。

考虑使用这样的函数:

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()
  • 使用headersbody的空数组初始化地图,这样就无需在迭代函数中进行特殊情况测试。
  • 声明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

初始化并存储数组。