Javascript 基于对象层次结构从数组中获取对象
我有一个对象数组,类似这样:Javascript 基于对象层次结构从数组中获取对象,javascript,arrays,Javascript,Arrays,我有一个对象数组,类似这样: let obj = [ { name: "Qwerty1", status: "Development" }, { name: "Qwerty2", status: "Development" }, { name: "Qwerty3", status: "Staging" }, { name: "Qwerty4", status: "Production" }, { name: "Qwerty5", status: "Production" }
let obj = [
{ name: "Qwerty1", status: "Development" },
{ name: "Qwerty2", status: "Development" },
{ name: "Qwerty3", status: "Staging" },
{ name: "Qwerty4", status: "Production" },
{ name: "Qwerty5", status: "Production" }
]
我需要创建一个函数
getList(status) {
}
我将通过此功能的状态,例如:“开发”或“声明”或“生产”
现在,如果我将“Production”传递给这个函数,它应该返回一个包含所有状态为“Production”的对象以及所有状态为“Staging”和“Development”的对象的数组
如果我传递状态“Staging”,它应该返回一个包含所有状态为“Staging”的对象和所有状态为“Development”的对象的数组
如果我通过“Development”,它应该只返回状态为“Development”的对象数组
所以顺序是生产->暂存->开发(“生产”包括“暂存”,“暂存”包括“开发”)
请注意,我无法更改此obj中的任何内容,因为它来自API。查看列表并检查对象的状态是否等于或小于状态参数。要为每个状态指定数值,请创建状态->值的组合
const obj=[{“name”:“Qwerty1”,“status”:“Development”},{“name”:“Qwerty2”,“status”:“Development”},{“name”:“Qwerty3”,“status”:“Staging”},{“name”:“Qwerty4”,“status”:“Production”},{“name”:“Qwerty5”,“status”:“Production”}]
const statusToValue=新映射([['Development',0],'Staging',1],'Production',2]]
const getList=(status)=>obj.filter(o=>statusToValue.get(o.status)找到匹配的status
的最后一个索引,然后slice
从0到该索引的数组:
让obj=[
{名称:“Qwerty1”,状态:“发展”},
{名称:“Qwerty2”,状态:“发展”},
{名称:“Qwerty3”,状态:“暂存”},
{名称:“Qwerty4”,状态:“生产”},
{名称:“Qwerty5”,状态:“生产”}
]
函数getList(状态){
让最后一个索引;
for(设i=obj.length-1;i>=0;i--){
if(obj[i].状态===状态){
lastIndex=i;
打破
}
}
if(lastIndex==未定义){
返回[];
}
返回对象切片(0,lastIndex+1);
}
log(getList('Development');
log(getList('Staging');
console.log(getList('Production');
您只需使用.filter()
此代码循环通过obj
,创建订单,并使用.filter()
检查当前项是否在层次结构中的参数状态下
让obj=[
{名称:“Qwerty1”,状态:“发展”},
{名称:“Qwerty2”,状态:“发展”},
{名称:“Qwerty3”,状态:“暂存”},
{名称:“Qwerty4”,状态:“生产”},
{名称:“Qwerty5”,状态:“生产”}
]
让order=[…新集合(obj.map(e=>e.status));
函数getList(状态){
const output=obj.filter(e=>order.indexOf(status)>=order.indexOf(e.status));
返回输出;
}
console.log(getList(“Staging”);
简单但明确:
function getList(status) {
if (status === 'C') {
return obj
}
if (status === 'B') {
return obj.filter(object => object.status === 'B' || object.status === 'A')
}
if (status === 'A') {
return obj.filter(object => object.status === 'A')
}
}
使用对象文字将实际单词转换为数值以进行比较。这样,无论状态名称的字母顺序如何,都可以获得状态级别所需的顺序
let statusLevels={“开发”:0,“暂存”:1,“生产”:2};
设obj=[
{名称:“Qwerty1”,状态:“发展”},
{名称:“Qwerty2”,状态:“发展”},
{名称:“Qwerty3”,状态:“暂存”},
{名称:“Qwerty4”,状态:“生产”},
{名称:“Qwerty5”,状态:“生产”}
];
函数getStatusArr(itemStatus){
//根据对象文字将状态作为数值进行比较
return obj.filter(o=>statusLevels[o.status]是status
属性真的A
,B
,C
,…在obj中的顺序,还是那些占位符?对不起,我刚刚编辑了这个问题是的,但对于字母A、B、C,这些只是示例,实际上我有“Prod”、“Staging”和“Development”对于status@vindict如果您的状态为“Prod”、“Staging”和“Development”,那么层次结构是什么?请将其编辑到您的问题中。@vindict-只要状态具有固有的数值,或者您可以为其指定一个数值,您就可以使用此方法。请参见第二个示例。