【问题标题】:How to eliminate duplicate values in dropdown of a React Table - ReactJS/JavaScript如何消除 React Table 下拉列表中的重复值 - ReactJS/JavaScript
【发布时间】:2019-05-29 09:40:54
【问题描述】:

我正在尝试使用 React Table 学习多过滤器。这是我的Demo/Fiddle

我正在尝试消除我的 React Table 下拉列表中的重复值

        <Select
          style={{ width: "50%", marginBottom: "20px" }}
          onChange={entry => {
            this.setState({ select2: entry });
            this.onFilteredChangeCustom(
              entry.map(o => {
                return o.value;
              }),
              "firstName"
            );
          }}
          value={this.state.select2}
          multi={true}
          options={this.state.data.map((o, i) => {
            return { id: i, value: o.firstName, label: o.firstName };
          })}
        />

我在下拉列表中得到重复值。请帮助我如何消除下拉列表中的重复值。

。如您所见,Sam 来了两次。

。 Jones1 也来了两次。

基本上我在过滤每一列,上面的函数基本上处理过滤功能。请看截图。存在问题 - 我的 Json 数组中有一些值多次出现。但在下拉列表中,它们应该只出现一次。

编辑 1 - 我想要一个通用的解决方案,它可以应用于任意数量的下拉菜单。到目前为止,我已经得到了两个很好的答案。但是这两个答案都不是一概而论的。我想将此独特功能扩展到所有列。我将有 15 到 20 列。这就是为什么我需要一个通用的解决方案。

【问题讨论】:

  • 您在问如何在 JavaScript 中从集合中删除重复项?
  • @Dave Newton 基本上我不知道 Collection。我正在过滤每一列,上面的函数基本上处理过滤功能。请看截图。存在问题 - 我的 Json 数组中有一些值多次出现。但在下拉列表中,它们应该只出现一次。
  • 集合(名词):一组事物或人。我的意思是,您基本上是在问如何过滤一个集合,这个集合无处不在。

标签: javascript reactjs react-table


【解决方案1】:
var names = this.state.data.map((o, i) => {
  return o.firstName
})

var uniqueNames = names.filter(function(i, index){
    return names.indexOf(i) >= index
});

https://codesandbox.io/s/40n0jnzk5x 请参阅修复 firstdropdown

辅助函数

var uniqueOptions = (objectsArray, objectKey) => {

   var a = objectsArray.map((o, i) => {
     return o[objectKey]
   })

   return a.filter(function(i, index){
      return a.indexOf(i) >= index
   })
}

名字下拉列表的用法(与任何其他下拉列表相同)

      ....
      multi={true}
      options={this.uniqueOptions(this.state.data, 'firstName').map((name, i) => {
        return { id: i, value: name, label: name };
      })}
      ...

理想情况下,您会计算此外部渲染以防止在每次渲染时重新计算,但您明白了

【讨论】:

  • 是的,我理解你的逻辑。但是我如何在我的代码中使用它。你能不能把我的小提琴分叉给我看。有两个下拉菜单。请更新我的沙盒并在我的代码中展示它是如何工作的。这是我的小提琴 - codesandbox.io/s/w2wjnz61l5
  • 我想要一个通用的解决方案,它适用于所有字段,如名字、姓氏。您的解决方案仅适用于名字。
  • 对姓氏应用相同的。您可以编写一个函数来同时解决这两个问题,但我认为这是一个更简洁的解决方案
  • 我们能否有一个更通用的解决方案。请参阅我必须为每个下拉列表基本上 2 行代码。如果我有 15 列必须一次又一次地写这个 - var names = this.state.data.map((o, i) => { return o.firstName })
  • 添加了一个可以直接使用的辅助函数,为什么要设置你的选项
【解决方案2】:

试试这个

const getOptions = propertyName => {
  return this.state.data.reduce((accum, elem, i) => {
    const accumulator = [...accum];
    if (!accumulator.some(e => e.value === elem[propertyName])) {
      accumulator.push({
        id: i,
        value: elem[propertyName],
        label: elem[propertyName]
      });
    }
    return accumulator;
  }, []);
};

getOptions("FirstName")

【讨论】:

  • 我想要一个通用的解决方案,它适用于所有字段,如名字、姓氏。您的解决方案仅适用于名字。
  • 你能把小提琴分叉给我看吗?基本上我希望所有列都有这个。请更新 Fiddle/Sandbox 并在我的代码中展示它是如何工作的。这是小提琴 -codesandbox.io/s/yvpq6lx4j1
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2021-12-17
  • 2021-12-13
  • 1970-01-01
  • 2018-10-23
  • 2014-06-07
相关资源
最近更新 更多