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-只要状态具有固有的数值,或者您可以为其指定一个数值,您就可以使用此方法。请参见第二个示例。