使用 lodash 键入错误以从对象数组创建唯一数组

Posted

技术标签:

【中文标题】使用 lodash 键入错误以从对象数组创建唯一数组【英文标题】:Type error using lodash to create a unique array from an array of objects 【发布时间】:2018-11-24 14:18:19 【问题描述】:

我得到的错误是 'LoDashExplicitWrapper<string[]>' is not assignable to type 'string[]'. Property 'length' is missing in type 'LoDashExplicitWrapper<string[]>'. 使用 lodash v4.17.10

我有一个对象数组,我正在尝试获取一个数组,该数组只包含每个对象的属性的唯一值。

代码:

let carMakes: string[]
const inventory = [
   make: "ford", model: "Focus" ,
   make: "ford", model: "F-150" ,
   make: "chevy", model: "Camaro" 

carMakes = _.chain(inventory)
            .map('make')
            .uniq()

我有什么办法可以通过链接来完成这项工作,因为这看起来像是一个不错的干净解决方案,尽管它不起作用(在我的 Angular 项目中)

【问题讨论】:

【参考方案1】:

只需使用一个普通的 js Set 和 map() 数据一次。通过使用Array.from() 直接将其重新转换为数组,您将获得所需的string[]

const inventory = [
    make: "ford",
    model: "Focus"
  ,
  
    make: "ford",
    model: "F-150"
  ,
  
    make: "chevy",
    model: "Camaro"
  
];

const unique =  Array.from(new Set(inventory.map((make) => make)));
console.log(unique);

【讨论】:

哦,忘记了 Sets,因为我以前没有使用过它们。但是,我现在收到了这个新错误:[ts] Type 'Set<string>' is not an array type. Use compiler option '--downlevelIteration' to allow iterating of iterators. 不确定这在我的 angular-cli 项目的上下文中意味着什么。 对不起,忘记了这个专业的打字稿。我已经更新了答案,以便它适用于 ts @redOctober13 你就是炸弹,谢谢!我也喜欢解构路径。我还在学习,但是很容易将"downlevelIteration": true 添加到我的 tsconfig.json 文件中,然后它接受了解构版本。 是的,我也更喜欢解构。但是会有很多用户没有将它添加到 tsconfig...@redOctober13...我认为它最终并没有太大的区别 与 lodash 版本相比,这仍然有点难以阅读,因为它同时使用了 mapuniq,并且唯一的其他词是变量和属性名称,而这个仅限 JS 的版本有 4 个新词,并且还重复了“make”。因此,如果我可以将其转换为正确的类型,我更愿意使用 lodash 版本。【参考方案2】:

我应该以前看过这个。 lodash docs 对 _.chain() 说:

创建一个 lodash 包装器实例,该实例包装值并启用显式方法链序列。此类序列的结果必须用 _#value 展开。

因此,这就是使其工作所需的全部内容:

carMakes = _.chain(inventory)
            .map('make')
            .uniq()
            .value()

我之前尝试过这个,但是 VS Code 没有删除错误曲线 直到我奇怪地悬停在 value() 上,然后错误消失了。由于我之前没有这样做,所以我认为它不起作用。

【讨论】:

以上是关于使用 lodash 键入错误以从对象数组创建唯一数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 Lodash 从键值对数组中创建对象

使用 lodash 将对象转换为数组

使用 Lodash 按属性合并对象数组

在 Angular 上使用 lodash 过滤对象数组

将数组数组传递到 lodash 交集

如何使用 lodash 从复杂的对象数组中获取值?