【问题标题】:console.log of array returns undefined数组的 console.log 返回 undefined
【发布时间】:2020-12-01 17:22:50
【问题描述】:

我试图从一个对象中获取两条数据并将其作为一个新对象推送到一个数组中。数据由对我的 SQL 数据库的 API 调用提供。该 API 调用正常工作并在控制台表中显示对象。当脚本运行 forEach 方法将数据提取到自己的对象中,然后将该新对象推送到新数组时,新数组返回“未定义”。代码如下:

示例数据(目前只有一个占位符条目,事件数组将以这种格式植入多个示例)

events = [{location: "Emergency Shelter", latitude: "37.5434", longitude: "-77.4435"}]

声明的空数组和 API 调用正常运行:

let events = [];
let locations = [];

$.get("/api/events", data => {
 for (let i = 0; i < data.length; i++) {
   events.push(data[i]);
 }
});

console.table 正确显示对象并包含具有正确对应值的键“纬度”和“经度”

forEach 方法:

locations = events.forEach(location => {
  const coords = {};
  coords.latitude = location.latitude;
  coords.longitude = location.longitude;
  locations.push(coords);
});
console.log("Coordinates list: " + locations);

console.log 显示“坐标列表:未定义”

我觉得我可能在某个地方错过了退货,但我不确定在哪里。我尝试添加

return locations;

在 forEach 方法中,但它不会改变任何东西(我相信这会在通过整个数组之前退出我的函数)。任何帮助表示赞赏!

【问题讨论】:

  • events 不是一个数组,而是一个对象。你确定吗?
  • 它是一个对象数组。我的示例数据周围缺少括号。刚刚编辑。
  • 这很简单。请尝试运行我更新的答案。
  • 部分问题是 API 调用内部的范围问题。事件是 API 函数之外的一个空数组。我已经纠正了这一点,现在 console.log(events) 在 API 函数之外正确显示了对象。我已经尝试了@baymax 和 Peter Seliger 提供的 map 方法和 foreach 方法,但 console.log(locations) 仍然只显示一个空数组。感谢你们在这方面的持续帮助。
  • 它现在正在使用 map 方法。这对我来说似乎很奇怪,但解决方案是在将值推送到 API 调用内部之后运行 map 方法,如下所示。如果我删除一个或另一个,则数组为空。似乎多余,但它有效。 $.get("/api/events", data => { for (let i = 0; i

标签: javascript arrays object foreach


【解决方案1】:

forEach 什么都不返回,所以locations 应该是undefined。您不应将 forEach 的返回值传递给 locations

events.forEach(location => {
  const coords = {};
  coords.latitude = location.latitude;
  coords.longitude = location.longitude;
  locations.push(coords);
});
console.log("Coordinates list: " + locations);

你也可以使用map函数。

const events = [
  { location: 'Emergency Shelter', latitude: '37.5434', longitude: '-77.4435' }
];
const locations = events.map(({ latitude, longitude }) => ({
  latitude,
  longitude
}));

console.log(locations);

【讨论】:

  • 感谢您的回复。那么,当我需要位置函数循环遍历现有的称为事件的数组并获取每组坐标时,如何将坐标对象放入位置数组中?
  • 我认为我的回答应该有效。在forEach 函数之后你会得到locations 带有坐标的数组。
  • 啊哈,再次感谢。我明白了, forEach 应该只作为事件的方法运行,而不是定义位置数组。我进行了调整,现在它显示“坐标列表:[object Object]。
  • 您将在记录时看到数组的 [object Object]。如果你想查看完整的日志,你可以使用console.log(JSON.stringify(locations))
  • "感谢您的回复。那么,当我需要位置函数循环遍历称为事件的现有数组并获取每组坐标时,如何将坐标对象放入位置数组中? " ...尝试基于map 的方法,这也可以将您的代码压缩为...const locations = events.map(({ latitude, longitude }) =&gt; ({ latitude, longitude }));
【解决方案2】:

尝试基于map 的方法,该方法也可以将您的代码压缩为...

const events = [{
  location: "Emergency Shelter",
  latitude: "37.5434",
  longitude: "-77.4435"
}, {
  location: "Peopl's Kitchen",
  latitude: "36",
  longitude: "-78"
}, {
  location: "Salvation Army",
  latitude: "38",
  longitude: "-76"
}]; 

const locations = events.map(({ latitude, longitude }) => ({ latitude, longitude }));

console.log("Coordinates list: ", locations); // do not concatenate the result.
console.log("Coordinates list: " + locations);
console.log("Coordinates list: " + JSON.stringify(locations));
.as-console-wrapper { min-height: 100%!important; top: 0; }

map 通过迭代另一个数组来创建一个新数组,其中新数组的每一项都等于映射/转换函数的返回值,该函数在每个迭代步骤中都会处理原始数组的当前值。

【讨论】:

  • 谢谢彼得。所以这改变了一点。控制台日志现在显示“坐标列表:”(基本上,不显示未定义但也不捕获推送到位置的坐标数据
  • 也许您为您的 events 数组提供了简化的测试数据(3 个 event/location 项目的列表可以做到这一点)......比一个能够验证/演示提供了不同的方法。
  • 确定:添加到原帖
  • [object Object], [object Object], [object Object] 的日志记录是由于您的代码连接了locations 结果...console.log("Coordinates list: " + locations) 而它必须是console.log("Coordinates list: ", locations) 以便记录一些可读的数据结构(s )。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
相关资源
最近更新 更多