需要将数据传递到JavaScript forEach函数中

需要将数据传递到JavaScript forEach函数中,javascript,Javascript,我希望能够循环浏览JSON对象,并根据我要查找的内容返回一个值。假设对象包含人,每个人都有一个名字和一个zipcode。我想要一个函数,当我向它传递名称时,它将返回zipcode 下面的代码给了我一个“未定义”错误,所以它一定与作用域有关 var myArray=[ { "name":"Joe", "zip":90210 }, { "name":"Bill", "zip":94109 } ]; fu

我希望能够循环浏览JSON对象,并根据我要查找的内容返回一个值。假设对象包含人,每个人都有一个名字和一个zipcode。我想要一个函数,当我向它传递名称时,它将返回zipcode

下面的代码给了我一个“未定义”错误,所以它一定与作用域有关

var myArray=[
    {
        "name":"Joe",
        "zip":90210
    },
    {
        "name":"Bill",
        "zip":94109
    }
];

function findIt(myArray,target) {
    myArray.forEach(function (person) {
        if (person.name === target) {
            return person.zip;
        }
    });
}
var zip=findIt(myArray,"Joe");

您正在从匿名内部函数返回邮政编码,而不是从
findIt
函数返回邮政编码

要解决此问题,可以将匿名内部函数的结果存储在变量中,然后从
findIt
函数返回该变量,如下所示

var myArray=[
{
“姓名”:“乔”,
“zip”:90210
},
{
“姓名”:“账单”,
“zip”:94109
}
];
函数findIt(myArray,目标){
var回答;
myArray.forEach(函数(人){
如果(person.name==目标){
答案=person.zip;
}
});
返回答案;
}
var zip=findIt(myArray,Joe);

console.log(zip)
您是从匿名内部函数返回邮政编码,而不是从
findIt
函数返回邮政编码

要解决此问题,可以将匿名内部函数的结果存储在变量中,然后从
findIt
函数返回该变量,如下所示

var myArray=[
{
“姓名”:“乔”,
“zip”:90210
},
{
“姓名”:“账单”,
“zip”:94109
}
];
函数findIt(myArray,目标){
var回答;
myArray.forEach(函数(人){
如果(person.name==目标){
答案=person.zip;
}
});
返回答案;
}
var zip=findIt(myArray,Joe);

console.log(zip)您没有从函数返回任何内容

function findIt(myArray,target) { // <--------------------┐
    myArray.forEach(function (person) {          // <--┐  |
        if (person.name === target) {            //    |  |
            return person.zip; // returns this func ---┘  |
        }                                        //       |
    });                                          //       |
    // you need a return for this function  --------------┘
}

您不能
返回函数中的任何内容

function findIt(myArray,target) { // <--------------------┐
    myArray.forEach(function (person) {          // <--┐  |
        if (person.name === target) {            //    |  |
            return person.zip; // returns this func ---┘  |
        }                                        //       |
    });                                          //       |
    // you need a return for this function  --------------┘
}

一个回调版本,只是为了好玩:

function findIt(myArray,target, cb) {
    myArray.forEach(function (person) {
            if (person.name == target) cb(person.zip)
    });
}
比如:

更新:

下面是一个使用以下数组一次查找和使用一个zip值的示例

var myArray=[
    {
        "name":"Joe",
        "zip":90210
    },
    {
        "name":"Bill",
        "zip":94109
    },
    {
        "name":"Joe",
        "zip":12345
    }
];

现在,它应该为“90210”发出两次警报,为“12345”发出第二次警报,这是一个回调版本,只是为了好玩:

function findIt(myArray,target, cb) {
    myArray.forEach(function (person) {
            if (person.name == target) cb(person.zip)
    });
}
比如:

更新:

下面是一个使用以下数组一次查找和使用一个zip值的示例

var myArray=[
    {
        "name":"Joe",
        "zip":90210
    },
    {
        "name":"Bill",
        "zip":94109
    },
    {
        "name":"Joe",
        "zip":12345
    }
];

现在,它应该为“90210”发出两次警报,为“12345”发出第二次警报。

forEach的实现与fallowing类似,它不会返回有效值(未定义)

如果要在找到所需值后返回该值,请尝试以下操作:

function findIt(myArray,target) {
    for (var index in myArray) {
        if (myArray[index].name === target) {
            return myArray[index].zip;
        }
    }

}

如果数组中有很多项,则此示例将在找到匹配项后停止,而不是扫描所有项。

forEach
的实现与fallowing类似,它不会返回有效值(未定义)

如果要在找到所需值后返回该值,请尝试以下操作:

function findIt(myArray,target) {
    for (var index in myArray) {
        if (myArray[index].name === target) {
            return myArray[index].zip;
        }
    }

}


如果数组中有很多项,这个例子将在找到匹配项后停止,而不是扫描所有项。

这不是JSON。没有所谓的“JSON对象”。JSON总是一个字符串。总是。您拥有的是一个对象数组。您的findIt函数不返回任何内容,因此作为结果未定义。请使用
过滤器
(或
查找
,如果您使用的是ES6),而不是
forEach
。注意,即使您使用的是ES5,您也可以使用
数组。查找
。另外,
find
也存在一些兼容性问题。所以在使用它之前一定要检查它,这不是JSON。没有所谓的“JSON对象”。JSON总是一个字符串。总是。您拥有的是一个对象数组。您的findIt函数不返回任何内容,因此作为结果未定义。请使用
过滤器
(或
查找
,如果您使用的是ES6),而不是
forEach
。注意,即使您使用的是ES5,您也可以使用
数组。查找
。另外,
find
也存在一些兼容性问题。所以在使用它之前一定要检查它。你能为这个纯同步代码提供延续(回调)的用例吗?除了“只是为了好玩”,我的意思是…@naomik当然让我举个例子哦,做得很好。我没有考虑匹配多个项目作为有效答案+1您能为这个纯同步代码提供延续(回调)用例吗?除了“只是为了好玩”,我的意思是…@naomik当然让我举个例子哦,做得很好。我没有考虑匹配多个项目作为有效答案+1我非常喜欢这个答案。其他答案都是信息性的,我将更详细地介绍它们,但这是最简单的解决方案。谢谢大家!@EamonnGormley
forEach
用于数据结构中的查找是错误的
forEach
将迭代整个数组,无论找到匹配的速度有多快。请参阅我的答案以获得更好的解决方案。此外,如果相同的名称在数据中出现多次,则将始终返回最后一个匹配项。我认为这个行为是个错误,我非常喜欢这个答案。其他答案都是信息性的,我将更详细地介绍它们,但这是最简单的解决方案。谢谢大家!@EamonnGormley
forEach
用于数据结构中的查找是错误的
forEach
将迭代整个数组,无论找到匹配的速度有多快。请参阅我的答案以获得更好的解决方案。此外,如果相同的名称在数据中出现多次,则将始终返回最后一个匹配项。我认为这种行为是一种错误。