Javascript 有没有更好的方法可以有条件地推送到数组?

Javascript 有没有更好的方法可以有条件地推送到数组?,javascript,Javascript,我有一些从API返回的数据,还有一个空数组,我想在其中添加一些对象。我想对照API数据进行检查,如果其中存在某些内容,请向这个空数组中添加一些内容 到目前为止,我有类似的东西 const data = [ {id: 1, status: 'NO_ACTION_NEEDED'}, {id: 2, status: 'NEEDS_BILLING'}, {id: 3, status: 'NEEDS_CODING'}, {id: 4, status: 'NEEDS_INVOICING'},

我有一些从API返回的数据,还有一个空数组,我想在其中添加一些对象。我想对照API数据进行检查,如果其中存在某些内容,请向这个空数组中添加一些内容

到目前为止,我有类似的东西

const data = [
  {id: 1, status: 'NO_ACTION_NEEDED'},
  {id: 2, status: 'NEEDS_BILLING'},
  {id: 3, status: 'NEEDS_CODING'},
  {id: 4, status: 'NEEDS_INVOICING'},
];
利用这些数据,我做了如下工作:

const keys = []

if (data.some((appointment): boolean => appointment.billing_status === 'NO ACTION NEEDED')) {
  keys.push({ label: 'No Action Needed', value: 'NO ACTION NEEDED', color: 'red' })
}

if (data.some((appointment): boolean => appointment.billing_status === 'NEEDS_CODING')) {
  keys.push({ label: 'Needs Coding', value: 'NEEDS_CODING', color: 'yellow' })
}

// .... etc ....
const keys = [
  { label: 'No Action Needed', value: 'NO_ACTION_NEEDED', color: 'red' },
  { label: 'Needs Coding', value: 'NEEDS_CODING', color: 'yellow' },
  { label: 'Needs Invoicing', value: 'NEEDS_INVOICING', color: 'blue' },
  // .... etc
]
期望值是这样的:

const keys = []

if (data.some((appointment): boolean => appointment.billing_status === 'NO ACTION NEEDED')) {
  keys.push({ label: 'No Action Needed', value: 'NO ACTION NEEDED', color: 'red' })
}

if (data.some((appointment): boolean => appointment.billing_status === 'NEEDS_CODING')) {
  keys.push({ label: 'Needs Coding', value: 'NEEDS_CODING', color: 'yellow' })
}

// .... etc ....
const keys = [
  { label: 'No Action Needed', value: 'NO_ACTION_NEEDED', color: 'red' },
  { label: 'Needs Coding', value: 'NEEDS_CODING', color: 'yellow' },
  { label: 'Needs Invoicing', value: 'NEEDS_INVOICING', color: 'blue' },
  // .... etc
]

有没有一种更简单的方法来编写这样的东西,不管它是一个方法还是以某种方式将它抽象成一个函数?在我看来,它不是很干。

首先在
数据中创建一组
账单状态
es,然后迭代一组标签及其颜色以推送:

const billingStatuses = new Set(data.map(obj => obj.billing_status));
const possibleLabels = [['No Action Needed', 'red'], ['Needs Coding', 'yellow'] /* ... */];
for (const [label, color] of possibleLabels) {
  const value = label.toUpperCase().replace(/ /g, '_');
  if (billingStatuses.has(value)) {
    keys.push({ label, value, color });
  }
}
也可以创建对象而不是数组:

const possibleLabels = {
  'No Action Needed': 'red',
  'Needs Coding': 'yellow',
  // ...
};
for (const [label, color] of Object.entries(possibleLabels)) {
  // ...
现场演示:

const数据=[
{id:1,账单状态:'无需操作',
{id:999,账单状态:'无需采取行动',
{id:2,账单状态:'需要账单'},
{id:3,账单状态:'需要编码'},
{id:4,账单状态:'需要发票'},
];
常量可能值={
“无需操作”:“红色”,
“需要编码”:“黄色”,
// ...
};
const billingstatus=新集合(data.map(obj=>obj.billing_状态));
常量键=[];
for(对象条目的常量[标签,颜色](可能的标签)){
const value=label.toUpperCase().replace(//g,'.'''.'替换);
if(BillingStatus.has(值)){
按键({label,value,color});
}
}

控制台日志(键)类似的东西可能是另一种选择

const dic = {};
for (const d of data) {
    if (!dic.hasOwnProperty(d.status)) {
        let label, value, color;
        switch(d.status) {
            case 'NO_ACTION_NEEDED':
                label = 'No action needed';
                value = 'NO ACTION NEEDED';
                color = 'red';
                break;
            // other cases ...
            default:
            // in case you have a default value
                label = 'Default';
                value = 'Default';
                color = 'black';
        }
        dic[d.status] = {label, value, color};
    }
}
const keys = Object.values(dic);

简单,只需迭代一次数据。

使用
map
可以以最简单的方式完成此操作

复制品 例如:

const key=data.map((约会)=>{
交换机(预约、计费和用户状态){
案例“无需采取行动”:
返回{标签:“无需操作”,值:“无需操作”,颜色:“红色”};
案例“需要编码”:
返回{标签:'需要编码',值:'需要编码',颜色:'黄色'};
//你要多少箱都行
违约:
返回false;
}
}).filter(项=>Boolean);
或者你可以这样做

const actions={
无需操作:{标签:“无需操作”,颜色:“红色”},
需要编码:{标签:'需要编码',颜色:'黄色'},
};
常量键=data.map((apoint)=>{
const action=actions[apoint.billing_status];
如果(!操作){
返回false;
}
返回{
标题:action.title,
值:apoint.u状态,
颜色:action.color,
};
}).filter(项=>Boolean);
.filter(项=>Boolean)
用于从数组中删除false(状态为不允许的元素)元素

无重复项:
//预定义数据
常数数据=[
{id:1,状态:'无需操作'},
{id:2,状态:'NEEDS_BILLING'},
{id:3,状态:'需要编码'},
{id:4,状态:'NEEDS_INVOICING'},
{id:5,状态:'需要编码'},
{id:6,状态:'NEEDS_BILLING'},
{id:7,状态:'NEEDS_INVOICING'},
];
//生成设置
常量状态数据映射={
无需操作:{标题:“无需操作”,颜色:“红色”,值:“无需操作”},
需要计费:{标题:“需要计费”,颜色:“黄色”,值:“需要计费”},
需要发票:{标题:“需要发票”,颜色:“蓝色”,值:“需要发票”},
};
//工作代码
常量状态=[];
data.forEach((apoint)=>{
if(状态包括(位置状态)){
返回;
}
状态推送(apointment.status);
});
const keys=statuses.map(status=>statusDataMap[status]).filter(布尔);
//结果
控制台日志(键)