尝试遍历Map元素时发生TypeError

时间:2018-06-22 09:30:06

标签: javascript firebase-realtime-database google-cloud-functions

我正在尝试遍历Map对象的元素,并得到以下错误:

TypeError: cr.forEach is not a function
   at exports.onNewOrder.functions.database.ref.onCreate.event (/user_code/index.js:122:12)
   at Object.<anonymous> (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:112:27)
   at next (native)
   at /user_code/node_modules/firebase-functions/lib/cloud-functions.js:28:71
   at __awaiter (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:24:12)
   at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:82:36)
   at /var/tmp/worker/worker.js:728:24
   at process._tickDomainCallback (internal/process/next_tick.js:135:7)

这是我在Google Cloud Function中运行的代码:

function logMapElements(value, key, mapObj) {
    console.log(`m[${key}] = ${value}`);
}    

exports.onNewOrder = functions.database.ref('/orders/{orderId}').onCreate(event => {

    const data = event.val();
    const cr = data.crs;
    console.log(cr);

    cr.forEach(logMapElements);
}

这是console.log(c)在日志中显示的内容:

{ cr_36446aba912c45d0956e57cbf0a4e165: 1, cr_d46f4c12119e45478a0aa2867df55e09: 1 }

我在这里做什么错了?

4 个答案:

答案 0 :(得分:1)

forEach()仅适用于数组,crobject

您可以改用map()。或使用Object.values()将对象转换为数组(另请参见Object.keys()Object.entries()

答案 1 :(得分:1)

因为cr不是数组,所以 不能使用数组的方法。尝试在此处使用for (bar propertyName in object)循环。

for(var id in cr){
   var value = cr[id]
   ...
}

答案 2 :(得分:1)

您必须像这样使用它:

  Object.keys(object).map(function(objectKey, index) {
  var value = object[objectKey];
  console.log(value);
  });

答案 3 :(得分:1)

尽管Sidhanshu_,user9977547和Fabien Greard的答案都可能奏效,但我认为使用Firebase内置的DataSnapshot.forEach方法更惯用:

exports.onNewOrder = functions.database.ref('/orders/{orderId}').onCreate(event => {
    event.child("crs").forEach(child => {
      console.log(child.val());
    });
}

虽然Array.forEach()DataSnapshot.forEach()之间的结果在这里是相同的,但在其他一些情况下却有细微的差别。当您从Firebase数据库中查询数据时,DataSnapshot.forEach()将按照请求的顺序迭代子级,而到Array.forEach()时,您通常会丢失该顺序。为避免细微的错误,我建议对Firebase数据库中的任何数据使用DataSnapshot.forEach()