使用键属性显示不同的值

Posted

技术标签:

【中文标题】使用键属性显示不同的值【英文标题】:Showing the distinct values using key property 【发布时间】:2019-12-10 22:58:10 【问题描述】:

我正在构建一个类别过滤器,但我一直在显示选项的重复项。

我有一个对象数组:

filterData = [
   name: 'Aang', bender: 'yes', nation: 'Air', person: 'yes', show: 'ATLA' ,
   name: 'Appa', bender: 'yes', nation: 'Air', person: 'no', show: 'ATLA' ,
   name: 'Asami', bender: 'no', nation: 'Republic City', person: 'yes', show: 'LOK' ,
   name: 'Azula', bender: 'no', nation: 'Fire', person: 'yes', show: 'ATLA' 
];

如您所见,'bender' 属性只有两种变体:yes 和 no。我试图获得一个单独的是和否数组:

benderArray = this.filterData.map((e) => 
    return e.bender
  )

我正在尝试使用选项标签显示每个值,但我只需要唯一值。

<select id="bender" value=this.state.bender>
  benderArray.map(option => <option key=option value=option>option</option>)
</select>

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

您可以使用set,它会自动为您删除所有重复值:

const filterData = [ name: 'Aang', bender: 'yes', nation: 'Air', person: 'yes', show: 'ATLA' ,  name: 'Appa', bender: 'yes', nation: 'Air', person: 'no', show: 'ATLA' ,  name: 'Asami', bender: 'no', nation: 'Republic City', person: 'yes', show: 'LOK' ,  name: 'Azula', bender: 'no', nation: 'Fire', person: 'yes', show: 'ATLA' ];

const filtered = [...new Set(filterData.map(i => i.bender))]
console.log(filtered)

您也可以将setreduce 一起使用,并随时添加值:

const filterData = [ name: 'Aang', bender: 'yes', nation: 'Air', person: 'yes', show: 'ATLA' ,  name: 'Appa', bender: 'yes', nation: 'Air', person: 'no', show: 'ATLA' ,  name: 'Asami', bender: 'no', nation: 'Republic City', person: 'yes', show: 'LOK' ,  name: 'Azula', bender: 'no', nation: 'Fire', person: 'yes', show: 'ATLA' ];

const set = new Set([])
const filtered = filterData.reduce((a, bender:b) => (!set.has(b) && set.add(b) && a.push(b), a), [])
console.log(filtered)

最后,你可以单独使用reduce

const filterData = [ name: 'Aang', bender: 'yes', nation: 'Air', person: 'yes', show: 'ATLA' ,  name: 'Appa', bender: 'yes', nation: 'Air', person: 'no', show: 'ATLA' ,  name: 'Asami', bender: 'no', nation: 'Republic City', person: 'yes', show: 'LOK' ,  name: 'Azula', bender: 'no', nation: 'Fire', person: 'yes', show: 'ATLA' ];

const filtered = filterData.reduce((a, bender:b) => (!a.includes(b) && a.push(b), a), [])
console.log(filtered)

如果你愿意,你可以把它变成一个实用函数,这样你就可以在其他属性上调用它:

const filterData = [ name: 'Aang', bender: 'yes', nation: 'Air', person: 'yes', show: 'ATLA' ,  name: 'Appa', bender: 'yes', nation: 'Air', person: 'no', show: 'ATLA' ,  name: 'Asami', bender: 'no', nation: 'Republic City', person: 'yes', show: 'LOK' ,  name: 'Azula', bender: 'no', nation: 'Fire', person: 'yes', show: 'ATLA' ];

const getUniqueValues = (data, prop) => 
    const s = new Set([])
    return filterData.reduce((a, [prop]:p) =>
        (!s.has(p) && s.add(p) && a.push(p), a)
    , [])


console.log(getUniqueValues(filterData, 'bender'))
console.log(getUniqueValues(filterData, 'show'))
console.log(getUniqueValues(filterData, 'nation'))

从这个JSPerf可以看出set+reduce是最好的方法:

【讨论】:

【参考方案2】:

您应该事先过滤您的数组以仅保留唯一值

benderArray = this.filterData.map((e) => 
    return e.bender
  ).filter((e, index, self) => self.indexOf(e) === index);

【讨论】:

以上是关于使用键属性显示不同的值的主要内容,如果未能解决你的问题,请参考以下文章

为 mac 催化剂的 info.plist 文件中的键设置不同的值

为 mac 催化剂的 info.plist 文件中的键设置不同的值

rmongodb 没有为键返回不同的值

Magento 1.9 Multi Store不同的超级属性值

如何使用不同的主键属性更新 RestKit 中的已发布对象?

哈希中每个键的不同类型的值