我正在使用Node.js ,并从一个URL获取数据,该URL返回一个包含28000多个json对象的列表.我想将每个对象标识符映射到它的一个子对象.我看到的JS中的每个映射示例都期望JSON采用类似"id:Value"的键值格式

我得到的json数据是

  '28338': {
    high: 696000000,
    highTime: 1691191991,
    low: 672500000,
    lowTime: 1691190341
  }

我想创建一张28338:高的 map .

每个顶级字段(28338)都是唯一命名的,所以我不能只说MAP ID:HIGH,因为那个字段不叫ID.它叫28338.而在物品ID 28337上,该字段被称为28337等.1-28000+,因此ID需要映射28000+次.

我的最终目标是从url获取最新的商品价格,然后创建一个 map ,如28338:696000000,这样我以后就可以遍历它并更新一个SQLite数据库.update items SET itemValue = ? where itemID = ?(高,28338).

但现在我甚至不能建立物体的 map .

async function getData() {
    const url = 'https://prices.runescape.wiki/api/v1/osrs/latest';
    const response = await fetch(url);
    const jsonResponse = await response.json();
    console.log(jsonResponse);
  
    return Object.keys(jsonResponse).reduce((result, key) => {
      result[key] = jsonResponse[key].high;
      return result;
    }, {})
} 
const myList = await getData();

当我在一个控制台中测试它时,如果我使用console.log(MyList),它会返回{ data: undefined }

推荐答案

您可以使用Object.entries()reduce()来实现您想要的功能:

async function getData() {
  const url = 'https://prices.runescape.wiki/api/v1/osrs/latest';
  const response = await fetch(url);
  const jsonResponse = await response.json();

  return Object.entries(jsonResponse.data).reduce(
    (agg, [key, { high }]) => (agg[key] = high, agg),
    {}
  );
}

getData().then(console.log);
/* Stackoverflow: show only console */

.as-console-wrapper {
  max-height: 100% !important;
  top: 0;
}

其思想很简单:您可以使用Object.entries()获得包含键-值对的数组数组,然后只需使用valuekeyhigh属性构建一个新对象.

回调reduce()在这里为我们提供了两个相关的参数.聚合值(这里是agg)和迭代的当前值.对于当前值,我们使用了相当多的descructuring.我们知道我们从Object.entries() [key, value]得到了一个这样的数组,所以我们可以立即像这样进行分解,所以我们已经有了新对象的key.此外,我们还需要valuehigh属性值.我们知道价值是这样的:

{
    high: 696000000,
    highTime: 1691191991,
    low: 672500000,
    lowTime: 1691190341,
}

所以我们可以只使用对象分解来获得我们感兴趣的一个值,就像这个{ high }.

其余的很简单:我们将值为highkey赋给新对象agg,并返回agg,这样它就可以在下一次迭代中再次传递给我们.最终,我们将得到预期的结果.

当然,您不必使用解构或只使用一些.因此,reduce()中的回调也可能如下所示(所有回调在功能上都相同):

// Without desctructuring
(agg, keyValue) => (agg[keyValue[0]] = keyValue[1].high, agg)

// With destructuring the array (which I would recommend, since I think it is more readable)
(agg, [key, value]) => (agg[key] = value.high, agg)

// Also destructure the value
(agg, [key, { high }]) => (agg[key] = high, agg)

Javascript相关问答推荐

设置默认值后动态更新japbox或调色板

禁用从vue.js 2中的循环创建的表的最后td的按钮

JavaScript文本区域阻止KeyDown/KeyUp事件本身上的Alt GR +键组合

使用print This时, map 容器已在LeafletJS中初始化

是什么原因导致此Angular 16应用程序中类型错误时属性结果不存在?

Vue:ref不会创建react 性属性

IMDB使用 puppeteer 加载更多按钮(nodejs)

React Code不在装载上渲染数据,但在渲染上工作

空的结果抓取网站与Fetch和Cheerio

使用Promise.All并发解决时,每个promise 的线性时间增加?

有条件重定向到移动子域

确保函数签名中的类型安全:匹配值

覆盖加载器页面避免对页面上的元素进行操作

从另一个数组中的对应行/键值对更新数组中的键值对对象

使用插件构建包含chart.js提供程序的Angular 库?

处理app.param()中的多个参数

我无法在Api Reaction本机上发出GET请求

对不同目录中的Angular material 表列进行排序

将字符串解释为数字;将其重新编码为另一个基数

如何使用useparams从react路由中提取id