从lodash.find方法获取未定义的对象集合中的项目

时间:2018-04-17 10:14:06

标签: javascript arrays typescript lodash

我正在尝试使用values方法从基于数组的对象 lodash.find 集合中查找项目,但我得到的返回值是“未定义”。以下是我在 typescript

中使用的代码
this.toFilterId = 2;
this.values = [];

//valueModel is a class with properties - id, code and description and I cant change its definition
export class valueModel {
constructor(
  public id: number,
  public code: string,
  public description: string
  ) { }
}

this.values.push(new valueModel(-1, 'TestAll', 'TestAllDesc'));
this.values.push(new valueModel(1, 'Test1', 'Test1Desc'));
this.values.push(new valueModel(2, 'Test2', 'Test2Desc'));
this.values.push(new valueModel(3, 'Test3', 'Test3Desc'));

const selectedValue = lodash.find(this.values, (filterItem: valueModel) => {
          return filterItem.id === this.toFilterId;
      });

//below console prints undefined instead of the valueModel object with id of 2
console.log('selectedValue:', selectedValue); 

我不确定为什么 selectedValue var的控制台日志上面打印'undefined'。我在SO lodash.find()方法中提到了lodash文档和其他类似问题,但它没有返回正确的值。

有人可以帮助我找出使用lodash.find()方法的错误吗?

2 个答案:

答案 0 :(得分:1)

除了回调中的:valueModel之外,您的解决方案看起来很好。

删除它,除非您使用的是flow或TypeScript(问题中没有指出)。

编辑更新的问题提到这是打字稿。无论如何,您的解决方案有效:

https://codepen.io/anon/pen/VxZPEb?editors=0011

这里唯一的例外或差异是:

a)您实现的valueModel。双重和三重检查您可以通过model.id访问id。

b)你没有正确导入lodash - console.log(lodash)来仔细检查它是不是未定义。

答案 1 :(得分:1)

问题是回调函数中的this引用了Window。试试这个:

const selectedValue = lodash.find(this.values, ((filterItem: valueModel) => {
    return filterItem.id === this.toFilterId;
}).bind(this));

const self = this;
const selectedValue = lodash.find(this.values, (filterItem: valueModel) => {
    return filterItem.id === self.toFilterId;
});

显然,TypeScript和JavaScript在lambdas中处理this的方式有所不同。