【问题标题】:Pushing object to array in Javascript works but leads to error when function attempts to return it在 Javascript 中将对象推送到数组有效,但是当函数尝试返回它时会导致错误
【发布时间】:2018-12-11 04:05:23
【问题描述】:
function whatIsInAName(collection, source) {
//The purpose is to return an array which displays all objects which share name:value pairs in 'collection' and 'source.'
var arr = [];
var temp = [];

for (var i = 0; i < collection.length; i++) {

    var n = 0;

    loop0:
    for (var j = 0; j < Object.keys(source).length; j++) {


      if (collection[i].hasOwnProperty(Object.keys(source)[j]) && collection[i][Object.keys(source)[j]] == Object.values(source)[j]  ) {

        for(var k = 0; k < Object.keys(collection[i]).length; k++) {

          if (Object.keys(source).includes(Object.keys(collection[i])[k])) {

            n += 1;

            }

          }

        if (n == (Object.keys(source)).length){

          arr.push(collection[i]);  //PROBLEM EXISTS HERE, seemingly.
                                    //If this is commented out no errors occur.        
          break loop0;
        }

      }

    }


  }

  console.log(arr);  //This logs the desired result.
  return arr;   //This returns a type error.
}

//This is what I use to test which prompts the type error.
console.log(whatIsInAName(whatIsInAName([{ "apple": 1 }, { "apple": 1 }, { "apple": 1, "bat": 2 }], { "apple": 1 })));

当我运行这段代码时,预期的输出是:[{ 苹果:1 }, { 苹果:1 }, { 苹果:1个, 蝙蝠:2 }],事实上,如果 'console.log(arr)' 存在于那里,控制台将读取该输出。

我遇到的问题是,如果输入中的任何对象已被推送到预期的输出数组“arr”,那么在返回函数时控制台将记录错误:

TypeError: Cannot convert undefined or null to object
    at Function.keys (<anonymous>)
    at whatIsInAName (biyohehake.js:13:32)

尽管在尝试返回“arr”之前立即将所需的“arr”内容记录到控制台,但它仍会输出此错误,这似乎是问题所在。我真的很困惑它可以记录数组但不能返回它;我错过了什么?

【问题讨论】:

  • 你有一个内部的whatIsInAName() 和一个外部的whatIsInAName() 调用。外部没有第二个参数。 source 因此未定义,这会导致错误。:jsfiddle.net/khrismuc/eh3wrskz
  • 让这成为所有人关于复制粘贴和狭隘视野的危险的教训。
  • 此外,如果这只是通用键和值,则可以大大缩短此算法:jsfiddle.net/khrismuc/yzf7bsmr
  • 当然,我已经删除了冗余,因为我不再偏执了,我在函数中犯了一个根本性错误。

标签: javascript arrays object typeerror


【解决方案1】:
//这是我用来测试提示类型错误的。 控制台日志( 什么是名称( 什么是名称( [{“苹果”:1},{“苹果”:1},{“苹果”:1,“蝙蝠”:2}], { "苹果": 1 } ), /*参数 2*/ ) );

外部 whatIsInAName 函数调用没有第二个参数。

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 2016-12-26
    • 2016-11-24
    • 2019-02-20
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多