【问题标题】:Searching from multiple keys inside object in javascript (reactJS)在javascript(reactJS)中从对象内部的多个键中搜索
【发布时间】:2020-12-09 20:20:57
【问题描述】:

我有以下对象数组,表示产品的所有可能组合

[{id:25,attributes:[{id: 0, name: "Weight", option: "250gr"},{id: 0, name: "Roast", option: "Medium"},{id: 0, name: "Packaging", option: "Card"}
{id:26,attributes:[{id: 0, name: "Weight", option: "500gr"},{id: 0, name: "Roast", option: "Medium"},{id: 0, name: "Packaging", option: "Card"}
{id:27,attributes:[{id: 0, name: "Weight", option: "250gr"},{id: 0, name: "Roast", option: "Light"},{id: 0, name: "Packaging", option: "Card"}
{id:28,attributes:[{id: 0, name: "Weight", option: "250gr"},{id: 0, name: "Roast", option: "Light"},{id: 0, name: "Packaging", option: "Tin"}
]

在网页上,通过选择设置选项; select 还设置了一个 state 组件如下:

{Weight:"",Roast:"",Pakaging:""}

使用所选选项中的值,例如(假设仅选择重量和烘烤):

{Weight:"250gr",Roast:"Light",Packaging:""}

每次选择一个选项时,我都想缩小产品组合(基于选择),直到我最终只有一个选项可用(该组合也用于动态重新填充选择,根据先前的添加或删除可用选项选择)

直到现在我都在使用类似的东西(在 onChange 在选择上调用的函数内部):

const result = variations.filter((p) =>
  p.attributes.some((c) => c.option === event.target.value)
);

但是这种方式会根据最新的选择减少,所以如果我开始选择 250gr,它会给我一组 3 (25,27,28) 那么如果我选择中等,它会给我一组 2(25 和 26)只过滤中等并忽略重量

我正在寻找转换我的过滤器,而不是在 event.target.value 上的对象上,但我找不到正确的方法,有人可以帮忙吗?

【问题讨论】:

  • 你能发布完整的代码以便更好地了解你在做什么吗?
  • @MosheSommers 这是我的代码 codesandbox.io/s/elegant-tereshkova-7uovc?file=/src/App.js

标签: javascript arrays reactjs filter


【解决方案1】:

您需要像这样持久化选定的过滤器:

const [filters, setFitlers] = React.useState({});
const onFilterChange = (e) => {
        setFitlers(prevFilters => ({...prevFilters, [e.target.name]: e.target.name})
   }

现在你可以像这样过滤:

const result = variations.filter((p) =>
  Object.entries(filters).every(([key, value]) => p.attributes[key] === value)
);

Obejct.entries 将为您提供过滤器对象的键值对。对于每一个,您都会检查是否所有过滤器都匹配。

现在您只需为输入命名以适合您的名字:

<input name="weight" onChange={onFilterChange} .../>

要删除过滤器,也可以过滤过滤器对象以删除空字符串:

Object.entries(filters).filter(([key,value) => value).every.... 

【讨论】:

  • 我尝试了状态方法,将完整对象保存在过滤的对象中,每次我更改选择(页面上有任意数量的选择)时,我都会过滤并使用过滤的对象再次设置状态;它可以过滤(我可以到达一个结果设置所有选择)但它不会取消过滤并且我无法跟踪可用的选项它看起来像我所说的一个更复杂的问题
  • 这是我的代码codesandbox.io/s/elegant-tereshkova-7uovc?file=/src/App.js 它根本没有按预期工作,我对此感到很困惑 :( 例如,如果我在第一个字段中选择 250gr,它会将第二个和第三个设置为正确的方法,但是一旦在第二个中选择它会重置为未过滤的东西
  • 好的,你有一个非常嵌套的数据结构。看看这个:codesandbox.io/s/interesting-ives-jldhz?file=/src/App.js。您需要监听 onChange 之外的更改以获取所有需要的信息,因为设置状态是异步的。
  • 谢谢!这解决了我的问题的一部分,它不会从不可用的选项中过滤掉主要属性(因此它不会导致空变体数组),我还必须考虑如果所选选项是第一个或唯一的,这不应该被过滤出
  • 看来您只需要进行一些调整。很高兴有帮助。如果这回答了您的问题,您能否将其标记为已选中?
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 2022-10-04
  • 2013-04-02
  • 2014-11-28
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多