我希望能够遍历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");
答案 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
将停止迭代数据。
Array.prototype.find
&#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
一样运行,因为它会在找到第一个匹配项后立即返回。
Array.prototype.find
&#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之前的版本
find
&#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;
}
}
}
如果数组包含大量项目,则此示例将在找到匹配的项目后停止,而不是扫描所有项目。