【问题标题】:Unused property dropped?未使用的财产下降了?
【发布时间】:2018-12-27 16:11:54
【问题描述】:

第一件事,我的班级:

export class FooBar {
 ...
 isFavorite: boolean = false;

 constructor() {
   this.isFavorite = false;
  }
}

使用 Lodash 我对FooBar 的列表进行排序,因此我的最爱将位于列表顶部:

this.fooBars = _.orderBy(this.fooBars, ['isFavorite', 'name'], ['desc', 'asc']);

当我收藏一个项目并查看我的 console.log 时,它会这样说明:

注意#3 没有 isFavorite 属性...

每当我从未设置isFavorite 时,它都不会显示。这使得 Lodash 排序错误。
有没有办法始终显示这个属性,即使它是未使用/未设置/假的?

我试过了:
- 在类中将属性设置为 false
- 在类的构造函数中将属性设置为 false
- 在我的组件中循环 this.foobars,将它们全部设置为 false
- 为FooBar添加接口

【问题讨论】:

  • 在类声明中将 isFavorite 属性默认为 false 应该可以工作
  • 您已正确识别问题:在 JavaScript 中,默认值为 undefined。如果您可以向我们展示这些对象的构造代码,我们或许可以帮助您正确设置默认值
  • @Vlad274 有效问题...数据来自 .NET MVC API,但该 .NET 类没有 isFavorite 属性。可能是因为从 .NET 对象到 json 的序列化,属性被删除,因为它在 API 端不存在?
  • 基于没有该属性的 .NET 类,与其说它“被删除”,不如说它一开始就不存在。如果您正在执行一些 Angular 绑定以将其设置为 true(例如使用复选框),这是我所期望的行为。如果您绝对 100% 需要该属性存在,您可以使用 .map 方法将其添加到服务中的对象中。

标签: javascript json angular typescript lodash


【解决方案1】:

我认为这是默认类属性的 typeScript 方式

export default class FooBar {
  constructor(private isFavorite: boolean = false) {
     ...
  }
}

或者干脆

export class FooBar {
  constructor() {
     this.isFavorite = false;
  }
}

或者您可以使用_.orderBy iteratee 中的函数对您的列表进行相应的排序:

var foobars = [{isFavorite:false, name:"aaa"}, {isFavorite:true, name:"bbb"}, {isFavorite:false, name:"ccc"}, {name:"ddd"}]


foobars = _.orderBy(foobars, [function(foobar) {
    return foobar.isFavorite == true;
}, "name"], ["desc", "asc"]);

console.log(foobars)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多