首页 > 解决方案 > 有没有办法可以搜索两个 JSON 文件?

问题描述

目前,我正在研究一个搜索两个不同 JSON 文件的项目。现在,我有:

var search = message.content
 .split(/\s+/g)
 .slice(1)
 .join(' ');
if (!search) return message.reply('Please give a character name!');

var waifuobj = waifusearch; //My JSON file
var husbandoobj = husbandosearch; //My other JSON file

let WName = Object.values(waifuobj.waifuID).find(
 (value) => value.names.toLowerCase() === search.toLowerCase()
).names;
let HName = Object.values(husbandoobj.husbandoID).find(
 (value) => value.names.toLowerCase() === search.toLowerCase()
).names;

let WImg = Object.values(waifuobj.waifuID).find(
 (value) => value.names.toLowerCase() === search.toLowerCase()
).img_url;
let HImg = Object.values(husbandoobj.husbandoID).find(
 (value) => value.names.toLowerCase() === search.toLowerCase()
).img_url;

let WClaim = Object.values(waifuobj.waifuID).find(
 (value) => value.names.toLowerCase() === search.toLowerCase()
).claims;
let HClaim = Object.values(husbandoobj.husbandoID).find(
 (value) => value.names.toLowerCase() === search.toLowerCase()
).claims;

let embed = new MessageEmbed()
 .setTitle(`${WName}`)
 .setDescription(`Claims: ${WClaim}`)
 .setImage(`${WImg}`)
 .setColor('#f095d1')
 .setFooter(
  `Powered by: Twintails API `,
  `https://64.media.tumblr.com/1a1c3bcc08b5a048b90139a56fe7f415/tumblr_o9ku1rVS8z1vnqjx7o2_250.png`
 );

message.channel.send(embed);

我想要它,以便它搜索两个 JSON 文件。此代码现在搜索 waifusearch JSON 并找到所有 waifu 名称、img_url 和声明。我想要它,所以如果一个人搜索一个 hubo 名字,它会通过 hubosearch JSON 文件而不是 waifusearch 文件来查找。

waifuID 和 huboID 的示例:

标签: javascriptnode.jsdiscorddiscord.js

解决方案


您可以将两个对象放在一个数组中,然后使用该Array.prototype.find()函数。

// array of both objects
var data = [waifuobj, husbandoobj];

// try this:
const { names, claims, img_url } = Object.values(
  Object.values(
    data.find((obj) =>
      Object.values(Object.values(obj)[0]).find(
        (value) => value.names.toLowerCase() === search.toLowerCase()
      )
    )
  )[0]
)[0];

Array.prototype.reduce()编辑:我发现了一种使用该功能的更紧凑的方式。

const data = [waifuobj, husbandoobj];

const { names, claims, img_url } = data
  .reduce((a, v) => a.concat(Object.values(Object.values(v)).flat()), [])
  .find(({ names }) => names.toLowerCase() === search.toLowerCase());

推荐阅读