首页 > 解决方案 > 如何推送具有特定状态集的数据?

问题描述

我有一个包含以下内容的 config.ts 文件:

export const keyOrders: {} = {
    "aa": { active: true, order: 0 },
    "bb": { active: true, order: 1 },
    "cc": { active: true, order: 2 },
    "dd": { active: true, order: 3 },
    "ee": { active: false, order: 4 },
    "ff": { active: true, order: 5 }
};

如果 active 为真,我将尝试推送到数组。我尝试了以下代码,如果活动为真,则按下键,但如果活动为假,则返回“未定义”

public keys = [];
public keyOrders = keyOrders;

ngOnInit() {
     this.keys = Object.entries(this.keyOrders).map((a: any) => {
            if(a[1].active == 'true') {
                return a[0];
            }
        });
}

标签: javascriptangulartypescript

解决方案


使用filter后跟map

如果要根据项目的order属性对项目进行排序,请使用sort before map

filter只会保留通过谓词的项目,在这种情况下是一个真实的active属性。然后map将此数组映射到键。

在你的情况下, usingmap会给你一个相同长度的数组,你必须先过滤它。

type Order = { active: boolean, order: number };

const keyOrders: { [key: string]: Order } = {
  "aa": { active: true, order: 0 },
  "bb": { active: true, order: 1 },
  "cc": { active: true, order: 2 },
  "dd": { active: true, order: 3 },
  "ee": { active: false, order: 4 },
  "ff": { active: true, order: 5 }
}

this.keys = Object.entries(this.keyOrders)
  .filter(([_, val]) => val.active)
  .sort((a, b) => a[1].order - b[1].order)
  .map(([key, _]) => key);

要确定类型,Object.entries()必须由 Typescript 识别,为此,请添加"lib": [ "es2017.object" ]到您的tsconfig.json文件中。

这是一个 JavaScript 演示(类型被剥离):

const keyOrders = {
    "aa": { active: true, order: 0 },
    "bb": { active: true, order: 1 },
    "cc": { active: true, order: 2 },
    "dd": { active: true, order: 3 },
    "ee": { active: false, order: 4 },
    "ff": { active: true, order: 5 }
};

const keys = Object.entries(keyOrders)
  .filter(([_, val]) => val.active)
  .sort((a, b) => a[1].order - b[1].order)
  .map(([key, _]) => key);

console.log(keys);


推荐阅读