【问题标题】:Cannot make intersection between two nested arrays无法在两个嵌套数组之间进行交集
【发布时间】:2022-01-26 22:00:04
【问题描述】:

我正在使翻译动态化,但是当我必须显示另一个数组中的相应对象时,我在这部分中挣扎。

我有两个具有相同模型的数组,我想做的是,当我搜索翻译时,我还想显示其他语言的相应翻译。

目前,我只能显示您正在搜索的那个。

例如:如果我搜索句子 Are you sure?,除了 Are you sure? 句子之外,它还应该显示另一列中的相应句子语言。

这是一个带有示例的 sn-p:https://codesandbox.io/s/polished-smoke-n6w6i?file=/src/App.js

任何帮助将不胜感激。 提前谢谢!

【问题讨论】:

  • 国际化并非易事。最终你会遇到复杂的问题,例如正确处理可能有超过 2 种复数形式的语言的复数形式。使用一些 i18n 库,例如formatJS
  • @szaman,感谢您的回复!是的,我正在使用 react-i18next 库,但这不是为了那个,它只是为了我们的资源,我们想从管理面板管理这些资源。所以,我们从后端获取的所有本地化,我们都没有保存在 react 应用程序中的文件。

标签: javascript html reactjs


【解决方案1】:

逻辑是通过它们的id而不是它们的过滤选定的语言项。 id 取自默认语言项。

就是这样

const searchByresourceId = (targetLng, selectedResources) => {
  // get the default language item id
  const ids = selectedResources.map(({languageResources}) => languageResources.map(({id}) => id)).flat();

  return targetLng
    ?.map((item) => {
      const languageResources = item.languageResources.filter(
        (namespace) =>
          ids.includes(namespace.id)
      );
      return {
        ...item,
        languageResources
      };
    })
    .filter((item) => item.languageResources.length > 0);
}

你应该改变你设置状态的方式

const searchByresourceId = (targetLng, selectedResources) => {
  const ids = selectedResources.map(({languageResources}) => languageResources.map(({id}) => id)).flat();
  return targetLng
    ?.map((item) => {
      const languageResources = item.languageResources.filter(
        (namespace) =>
          ids.includes(namespace.id)
      );
      return {
        ...item,
        languageResources
      };
    })
    .filter((item) => item.languageResources.length > 0);
}

https://codesandbox.io/s/cranky-ellis-ccdhx?file=/src/App.js

代码当然没有优化,我只是演示了逻辑

【讨论】:

  • 非常感谢您的努力!这就是我要找的,但是还有一个问题,因为此时你只能用英语搜索,当我必须搜索其他语言时我该怎么办?我怎样才能以某种方式将它们结合在一起? @mosh
  • 我能想到的逻辑是将“搜索”部分与“查看”部分分开。 “搜索部分” - 在所有资源中搜索该术语并获取 ID。 “查看”部分 (2) 按 id 列表过滤默认和选定的语言资源。你可以尝试实现它。如果您需要更多帮助,我会花一些时间来帮助您
  • 很高兴听到 :) 我想知道它是否按预期工作。如果我输入A je i sigurt?,我只能在右侧列表中看到一项。可以吗?
  • :) 是的,类似这样(代码可以更漂亮更短,但主要是我的意思。我也会将searchByresourceId = (targetLng, selectedResources) 更改为searchByresourceId = (languages, selectedResources),因为这个论点并不孤单目标语言。
  • 当然,没问题:)
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 2021-11-14
  • 2016-01-20
相关资源
最近更新 更多