ES6方式 - 按键从嵌套数组中获取唯一值
Posted
技术标签:
【中文标题】ES6方式 - 按键从嵌套数组中获取唯一值【英文标题】:ES6 way - Get unique values from a nested array by key 【发布时间】: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 是的,没错,让我更新问题。
【参考方案1】:
如果你需要一些简洁的东西,你可以这么简单:
利用Set
去除重复项
使用Array.prototype.flatMap()
(轻轻触摸destructuring assignment)从所有对象中提取value
项目到单个数组中
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-wrappermin-height:100%;
如果您需要非常快的东西,您可以执行以下操作:
使用Array.prototype.reduce()
将您的数组变成Set
的唯一记录(循环使用Array.prototype.forEach
并执行Set.prototype.add()
的value
项)
将结果 Set
传播到数组和 .sort()
中
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-wrapperMin-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
不同意你的观点以上是关于ES6方式 - 按键从嵌套数组中获取唯一值的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 BigQuery 中取消嵌套数组,以便将嵌套数据按键值拆分为列?