需要将数据传递给JavaScript forEach函数

时间:2016-08-03 05:49:15

标签: javascript

我希望能够遍历JSON对象并根据我正在寻找的内容返回一个值。假设对象包含人,每个人都有一个名字和一个邮政编码。我想要一个函数,当我将名称传递给它时将返回一个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");

4 个答案:

答案 0 :(得分:3)

你不是{{1}你的职能中的任何东西

return

无论如何,即使您解决了这个问题,您的功能仍然可以使用一些工作。 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 --------------┘ } 将循环遍历整个数据集,即使它在第一个项目上找到匹配项也是如此。 forEach在这里使用是错误的。

您可以使用的一个非常简单的事情是forEach。一旦找到第一个匹配项,Array.prototype.find将停止迭代数据。

&#13;
&#13;
Array.prototype.find
&#13;
&#13;
&#13;

但是如果你宁愿自己将这个功能作为一种学习练习来实现,那就像这样。请注意,此代码将像var myArray=[ { "name":"Joe", "zip":90210 }, { "name":"Bill", "zip":94109 } ] const findIt = (data, target) => { // use Array.prototype.find let {zip} = myArray.find(({name})=> name === target) || {} return zip } console.log(findIt(myArray, 'Joe')) // => 90210 console.log(findIt(myArray, 'unmatched name')) // => undefined一样运行,因为它会在找到第一个匹配项后立即返回。

&#13;
&#13;
Array.prototype.find
&#13;
&#13;
&#13;

这是一种更智能的编写var myArray=[ { "name":"Joe", "zip":90210 }, { "name":"Bill", "zip":94109 } ] // implement generic find const find = f => ([x,...xs]) => { if (x === undefined) return undefined else if (f(x)) return x else return find (f) (xs) } // implement your function using find const findIt = (data, target) => { let {zip} = find (({name})=> name === target) (data) || {} return zip } console.log(findIt(myArray, 'Joe')) // => 90210 console.log(findIt(myArray, 'unmatched name')) // => undefined的方法,因为它不是通过循环遍历数据列表或返回匹配的对象,而只是调用泛型函数(findIt),它可以是由许多其他功能重新使用。

<强> ES5

作为礼貌,我提供上述代码的ES6之前的版本

&#13;
&#13;
find
&#13;
&#13;
&#13;

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

回调版,只是为了好玩:

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

像:

findIt(myArray,"Joe", function(zip){ alert(zip) });

更新

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

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

它现在应该警告两次&#34; 90210&#34; &#34; 12345&#34;

第二次

答案 3 :(得分:0)

forEach的执行方式类似于休假,它不会返回有效值(未定义)。

forEach(array, callback) {
    for (var index in array) {
        callback(array[index]);
    }
}

一旦找到它,你想要返回所需的值,所以试试这个:

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

}

如果数组包含大量项目,则此示例将在找到匹配的项目后停止,而不是扫描所有项目。