首页 > 解决方案 > 为数组中的每个项目声明变量,同时基于并行数组为每个变量设置名称

问题描述

我目前正在编写一个程序,该程序使用 fetch 从 API 返回响应。

到目前为止,我的 fetch 调用正常工作。然后我拼接数组并使用一些正则表达式将单个字符串响应转换为数字数组(同时还用 a 替换 /n 来格式化数据,因为它是原始 CSV 格式)。

这是代码...

let proxy = "https://cors-anywhere.herokuapp.com/"
    let url =  proxy + "https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player=Hess"

function getPlayer() {
  return fetch(url)
    .then((response) => response.text())
    .then((data) => {
      console.log(data)
      return data;
    });
}
getPlayer().then((playerData) => {
  console.log(playerData);
  // This next line removed the indentation and then splits the response into an array of multiple numbers and pushes that array to the array playerStats.
  playerStats.push(playerData.replace(/\n/ig, ',').split(','));
  console.log(playerStats);
});

我的问题是此响应返回 183 个数字,每个数字代表一个球员统计数据。

我想将这些数字中的每一个都保存为一个变量,但是这样做let attackLevel = playerStats[0]会非常乏味,并且会给我留下 183 个变量。

我的问题是,将每个数字保存为变量的最佳方法是什么?

我目前的想法是我拥有数组let playerStats = ["100", "242", "50"]并通过并行链接到数组以某种方式创建变量let statNames = ["attack", "defense", "age" ]。我的想法是,这样做可以让我只创建一个 2 个数组并让 js 生成变量。

我不确定这是否是一个有效的解决方案,也不知道如何去做这样的事情。

我看到的另一个选择是使用两个数组创建一个对象数组。这样,我可以使用 2 个数组创建 key:pairs,而不是 183 个变量。我想它看起来像这样......

'let stats = [攻击:100,防御:242等]`

使用第二个解决方案会更好地为我服务,因为我使用的是 svelte 并且使用对象数组会容易得多。

我不确定最好的做法是什么,或者如何使用这两个数组创建这些对象密钥对。

标签: javascriptarraysfetches6-promise

解决方案


如果您有两个像您描述的那样的数组,并且您希望最终将它们组合成一个包含由“并行”属性组成的对象的数组,然后在您的对象中使用括号表示法来动态声明属性名称:

const stats = [1, 2, 3];
const names = ['a', 'b', 'c'];

//As an array of objects
var combinedArr = [];
for (var i = 0; i < stats.length; i++) {
  combinedArr.push({ [names[i]]: stats[i] });
}

//As a single object
var combinedObj = {};
for (var i = 0; i < stats.length; i++) {
  combinedObj[names[i]] = stats[i];
}

console.log(combinedArr);
// Output: [{ a:1 }, { b:2 }, { c:3 }]

console.log(combinedObj);
// Output: { a:1, b:2, c:3 }

不过,您仍然需要在运行时拥有这些名称。
如果您对如何从 API 接收数据有任何控制权,您可能需要考虑使其对您的使用更加友好!


推荐阅读