【问题标题】:ES6 way - Get unique values from a nested array by keyES6方式 - 按键从嵌套数组中获取唯一值
【发布时间】:2020-11-06 14:33:38
【问题描述】:

试图提高我的 JS 能力。

有没有一种更简洁的方法可以通过键从嵌套对象中检索下面的数组中的属性值,删除重复项并按字母顺序对其进行排序?

这是我所拥有的:

getObjectValues(array, key){

      var unique = [];
      
      array.forEach(function(item){
        item[key].forEach(function(value){
          if (unique.indexOf(value) < 0) {
            unique.push(value)
          }
        })
      });

      return unique.sort();
    },

对象数组示例:

[
  { name: 'hello', value: ['a','b','c']},
  { name: 'hello', value: ['a','b','c']},
  { name: 'hello', value: ['a','b','c']}
]

预期的输出应该是一个数组:

var array = ['a','b','c']

【问题讨论】:

  • 什么不起作用?
  • 可能是唯一性和排序,因为“值”是数组。
  • 所以您的输入是list,而您传递的key'value'?
  • 那些0:1:3: 不要让它看起来像一个有效的数组。
  • @Bergi 是的,没错,让我更新问题。

标签: javascript sorting filtering


【解决方案1】:

如果你需要一些简洁的东西,你可以这么简单:

const src = [{name:'hello',value:['c','b','d']},{name:'hello',value:['e','b','c']},{name:'hello',value:['f','a','e']}],

      result = [...new Set(src.flatMap(({value}) => value))].sort()

console.log(result)
.as-console-wrapper{min-height:100%;}

如果您需要非常快的东西,您可以执行以下操作:

const src = [{name:'hello',value:['c','b','d']},{name:'hello',value:['e','b','c']},{name:'hello',value:['f','a','e']}],

      result = [...src.reduce((acc,{value}) => 
        (value.forEach(acc.add, acc), acc), new Set())].sort()

console.log(result)
.as-console-wrapper{Min-height:100%;}

【讨论】:

  • 如果你需要快速的东西,你也不应该使用flatMap,特别是如果你预计会有很多重复。永远不要在基准测试中使用console.log
【解决方案2】:

您可以只使用一个 Set,然后将所有项目添加到其中:

let arr = [
  { name: 'hello', value: ['a','b','c']},
  { name: 'hello', value: ['a','b','c']},
  { name: 'hello', value: ['a','b','c']}
]

console.log(
    Array.from(
        new Set(
            arr.reduce(
                (carry, current) => [...carry, ...current.value],
                 []
            )
        )
    ).sort()
)

【讨论】:

  • 用于将项目推入数组的扩展语法会对性能产生负面影响。
  • .sort 不同意你的观点
猜你喜欢
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多