为啥 forEach 函数不让我返回一个对象,甚至只是将它从函数中传递出去?

Posted

技术标签:

【中文标题】为啥 forEach 函数不让我返回一个对象,甚至只是将它从函数中传递出去?【英文标题】:Why isn't forEach function letting me returning an object or even just passing it out from the function?为什么 forEach 函数不让我返回一个对象,甚至只是将它从函数中传递出去? 【发布时间】:2019-06-28 13:54:05 【问题描述】:

我正在尝试制作一个简单的应用程序来显示和保存您的收藏夹(让我们轻松地称它们为“对象”)。我想这样做: 得到 vuex 的最爱, 在可能的收藏夹中找到最喜欢的, 随心所欲地管理我的最爱。

name 值是正确的,我已经知道 vuex 的状态。 Elenco 是一个由 JSON 获得的数组,它之所以有效,是因为我在 v-for 和其他两个函数中使用了它(没有一个使用 forEach 函数)。 if 语句效果很好,否则它不会显示第一个“i”。

let name = this.$store.state.favTime.id;
console.log(name);
Elenco.forEach(element => 
    if(element.name === name)
        var i = element;
        console.log(i); //element
    
);
console.log(i); //undefined

我只想访问那个对象,以便我可以操作它,但我不能,因为它是未定义的。

(希望正确地遵循这些准则,并希望我的英语足够好,使其易于理解,谢谢)。

【问题讨论】:

你已经定义了`var i = element;在 forEach 内部并尝试在其范围之外访问。在 forEach 之外声明它 ` 在 forEach 之前声明 i 将使其在循环之后的范围内,但它将包含 Elenco 中的最后一个元素,而不是具有匹配名称的那个。 【参考方案1】:

如果需要在 for 循环之后访问该变量,请在循环之前声明它:

var i;
Elenco.forEach(element => 
    if(element.name === name)
        i = element;
        console.log(i); //element
    
);
console.log(i);

【讨论】:

【参考方案2】:

您可能想使用.find()

let name = this.$store.state.favTime.id;

let elem = Elenco.find(element => 
    return element.name === name
);

console.log(element);

find() 方法返回数组中第一个元素的值 满足提供的测试功能。否则 undefined 是 返回。

如果要查找最后一个元素,可以reverse数组:

let name = this.$store.state.favTime.id;

let elem = [...Elenco].reverse().find(element => 
    return element.name === name
);

console.log(element);

【讨论】:

这在功能上与 OP 的代码不同。 OP 的代码会将最后一个匹配项存储在i 中,您的代码将返回第一个匹配项。如果那是 OP 需要的,我们都不知道,但您的回答无法解释这一点。 @connexo 你说得对,我更新了答案以匹配 OP 的情况。 您仍然没有明确声明您的第一种方法将返回第一个匹配项。 @connexo 我认为没有必要,因为我把链接放到了 find() 的 MDN,【参考方案3】:

如果可用,我建议您使用 find 而不是 forEach

const name = this.$store.state.favTime.id;
const favourite = Elenco.find(element => element.name === name)
console.log(favourite)

【讨论】:

这在功能上与 OP 的代码不同。 OP 的代码会将最后一个匹配项存储在 i 中,您的代码将返回第一个匹配项。如果那是 OP 需要的,我们都不知道,但您的回答无法解释这一点。【参考方案4】:

这是变量的局部和全局范围的问题。在 for 循环中创建的变量具有局部引用,因此请全局声明它们。

var name = "Johnny";

var Elenco = [
  
    name: "Jack Torrance",
    age: 50,
    eyeColor: "blue"
  ,
  
    name: "Toni",
    age: 8,
    eyeColor: "blue"
  ,
  
    name: "Johnny",
    age: 50,
    eyeColor: "blue"
  
];
var i = new Array();
Elenco.forEach(element => 
    if(element.name === name)
        i.push(element);
        console.log(i); //element
    
);
console.log(i);


【讨论】:

以上是关于为啥 forEach 函数不让我返回一个对象,甚至只是将它从函数中传递出去?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 xamarin 突然不让我部署到 iOS 设备

戴安娜是谁,她为啥不让我的数据库对象编译?

为啥我的 JSON 响应在 forEach 上崩溃? TypeError 未定义

为啥一个函数在一个文件中声明几次都可以?

为啥构造函数只能返回一个对象?

为啥我不能用开关检查函数的返回?