Javascript 有没有更好的方法可以有条件地推送到数组?
我有一些从API返回的数据,还有一个空数组,我想在其中添加一些对象。我想对照API数据进行检查,如果其中存在某些内容,请向这个空数组中添加一些内容 到目前为止,我有类似的东西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'},
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(布尔);
//结果
控制台日志(键)代码>