Javascript 如何在某个属性设置为false的对象数组中找到下一个对象?
我有一个对象(项目)数组,如下所示:Javascript 如何在某个属性设置为false的对象数组中找到下一个对象?,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一个对象(项目)数组,如下所示: const projects= [ { id: 1, name: 'project1', private: false }, { id: 2, name: 'project2', private: false }, { id: 3, name: 'project3', private: true }, { id: 4, name: 'proje
const projects= [
{
id: 1,
name: 'project1',
private: false
},
{
id: 2,
name: 'project2',
private: false
},
{
id: 3,
name: 'project3',
private: true
},
{
id: 4,
name: 'project4',
private: true
},
{
id: 5,
name: 'project5',
private: false
}
]
如果我像这样设置当前项目idcurrentProjectId=projects[0]。id
如何在数组中找到私有属性设置为false的下一个对象id
我不太确定如何执行此操作,我尝试使用Array.prototype.flitter()
函数创建一个新的数组publicProjects,其中所有对象的私有属性都设置为false,但不清楚如何从新数组中获取下一个对象并将其分配给名为nextProjectId的新变量。。。老实说,我不太确定创建一个新的过滤数组是否是正确的方法,所以任何建议都是非常感谢的
这里有一个链接,指向我尝试在新筛选的PublicPorObjects数组上使用Array.prototype.find()
函数,但是find方法始终返回数组中的第一个对象
基本上这就是我想要实现的
如果currentProjectId为1,则下一个ProjectId应为2。。
如果currentProjectId设置为2,则nextProjectId预计为5,因为私有属性在3和4上设置为true。。。最后,如果currentProjectId设置为5,则nextProjectId应为1您可以使用数组#reduce
并保留小于当前项目id的最小id(对于currentProjectId=2
,该值应为1
),以及大于当前项目id的最小id(对于currentProjectId=2
,该值应为5
)。如果第二个值存在,则获取它,否则获取第一个值。即使列表顺序不正确,这也会起作用。它只在数组中遍历一次
//只使用JSON.parse来节省空间,无需向下滚动
const projects=JSON.parse(`[{“id”:1,“name”:“project1”,“private”:false},{“id”:2,“name”:“project2”,“private”:false},{“id”:3,“name”:“project3”,“private”:true},{“id”:4,“name”:“project4”,“private”:true},{“id”:5,“name”:“project5”,“private”:false}`);
函数getNextId(currentProjectId){
var result=projects.reduce(函数(minList,item){
if(item.private | | currentProjectId==item.id)返回minList;
var index=currentProjectId console.log(getNextId(5));//1
一种方法是过滤数组,查找元素并返回下一个元素:
const项目=[
{id:1,名称:“project1”,private:false},
{id:2,名称:“project2”,private:false},
{id:3,名称:“project3”,private:true},
{id:4,名称:“project4”,private:true},
{id:5,名称:“project5”,private:false}
];
const getNextProject=(id,pr)=>{
常量f=pr.filter(o=>!o.private)
返回f[f.findIndex(o=>id==o.id)+1]| | f[0]
}
log(getNextProject(1,projects))//返回{id:2…}
log(getNextProject(2,projects))//返回{id:5…}
console.log(getNextProject(5,projects))//返回{id:1…}
这可以通过在原始数组上使用Array.slice
仅在当前索引之后搜索来完成
例如:
const项目=[
{
id:1,
名称:“项目1”,
二等兵:错,
},
{
id:2,
名称:“项目2”,
二等兵:错,
},
{
id:3,
名称:“项目3”,
二等兵:是的,
},
{
id:4,
名称:“项目4”,
二等兵:是的,
},
{
id:5,
名称:“项目5”,
二等兵:错,
},
]
const findNextPrivateProject=(currentprojectd,projects)=>{
const currentProjectIndex=projects.findIndex(
project=>project.id==currentProjectId
)
返回项目
.slice(currentProjectIndex+1)
.find(project=>!project.private)
}
设currentprojectd=1
document.getElementById('next-private-project')。addEventListener('click',()=>{
const nextPrivateProject=findNextPrivateProject(currentprojectd,projects)
console.log(nextPrivateProject)
currentProjectId=nextPrivateProject.id
如果(currentProjectId>=projects[projects.length-1].id)
CurrentProjectd=1
})
Find Next Private Project
您可以选择一个,只获取带有Private:false
的项目
constprojects=[{id:1,名称:'project1',private:false},{id:2,名称:'project2',private:false},{id:3,名称:'project3',private:true},{id:4,名称:'project4',private:true},{id:5,名称:'project5',private:false}];
项目[Symbol.iterator]=函数*(){
var i=0;
如果(this.every({private}=>private))返回;//防止永远运行
while(true){
如果(!this[i].private)产生这个[i];
i++;
i%=此长度;
}
}
var nextFalse=projects[Symbol.iterator]();
log(nextFalse.next().value);
log(nextFalse.next().value);
log(nextFalse.next().value);
console.log(nextFalse.next().value);
.as console wrapper{max height:100%!important;top:0;}
可以说,最惯用的方法是使用一两次:
const项目=[
{
id:1,
名称:“项目1”,
二等兵:错
},
{
id:2,
名称:“项目2”,
二等兵:错
},
{
id:3,
名称:“项目3”,
二等兵:对
},
{
id:4,
名称:“项目4”,
二等兵:对
},
{
id:5,
名称:“项目5”,
二等兵:错
}
];
const condition=obj=>!obj.private;
函数getNextProject(项目,id){
返回projects.find(obj=>obj.id>id&&condition(obj))|| projects.find(c
function setNextProjectId() {
// find index of current Project Id
var currentProject = publicProjects.find(x => x.id === currentProjectId );
if(currentProject){
var index = publicProjects.indexOf(currentProject, 0);
nextProjectId = publicProjects[index + 1].id;
return;
} else
{
nextProjectId = publicProjects[0];
}
}
function setNextProjectId() {
// find index of current Project Id
var index = publicProjects.findIndex(x => x.id === currentProjectId );
nextProjectId = index >= 0 ? publicProjects[index + 1].id : publicProjects[0].id;
}