Javascript:如何有条件地向数组中的某些对象动态添加属性并保持数组的原始顺序

Javascript:如何有条件地向数组中的某些对象动态添加属性并保持数组的原始顺序,javascript,arrays,sorting,Javascript,Arrays,Sorting,这个问题涉及到和问题 我有一个这样的数组 const问题=[ {{u id:1,q:'为什么?',组:'没有组',日期:'8',选择:false}, {{u id:2,q:'what?',group:'no group',date:'6',selected:false}, {{u id:3,q:'when?',group:'no group',date:'7',selected:false}, {{u id:4,q:'where?',group:'no group',date:'5',sele

这个问题涉及到和问题

我有一个这样的数组

const问题=[
{{u id:1,q:'为什么?',组:'没有组',日期:'8',选择:false},
{{u id:2,q:'what?',group:'no group',date:'6',selected:false},
{{u id:3,q:'when?',group:'no group',date:'7',selected:false},
{{u id:4,q:'where?',group:'no group',date:'5',selected:false},
{{u id:5,q:'which?',group:'no group',date:'3',selected:false},
{{u id:6,q:'who?',组:'no group',日期:'0',所选内容:false},
{{u id:7,q:'为什么不?',组:'没有组',日期:'9',选择:false},
{{u id:8,q:'谁,我?',组:'没有组',日期:'4',选择:false},
{{u id:9,q:'waldo在哪里?',group:'no group',date:'1',selected:false},
{{u id:10,q:'哪条路是向上的?',组:'没有组',日期:'2',所选内容:false},
{{u id:11,q:'什么时候吃午饭?',组:'没有组',日期:'10',所选内容:false},
];
//函数将一系列选定的问题作为参数
功能组SelectedQuestions(SelectedQSID){
让newQuestions=questions.map(question=>{
if(selectedQsIds.length==1&&selectedQsIds.includes(question.\u id)){
问题组=‘无组’;
返回问题
}否则
if(selectedQsIds.length>1&&selectedQsIds.includes(问题号)){
问题组=‘第1组’;
返回问题
}否则{
返回问题;
}
})
返回新问题
}

console.log(groupSelectedQuestions([1,2,5]))
我建议您首先为所选问题指定一个新的组名,然后浏览所有问题以查看需要更新的内容:

  • 应为每个组确定
    日期
    的最小值,以及组的大小
  • 按照最小
    日期增加的顺序,这些组应重新分配一个后缀增加的名称,如果其大小为1,则应重新分配“无组”
因此,您仍然可以排序,但只是暂时的,不会影响问题本身

以下是如何对其进行编码:

功能组SelectedQuestions(SelectedQSID){
//首先天真地将匹配项分配给组“新建”:
对于(让问题的数量为q){
if(selectedQsIds.includes(q._id))q.group=“new”;
}
//分组收集问题
让map=newmap;
对于(让问题的数量为q){
设group=map.get(q.group);
if(!group)map.set(q.group,group={date:q.date,count:0,questions:[]});
组。问题。推送(q);
group.count++;
}
//获取选定的问题
让newGroup=map.get(“new”).提问;
//忽略“无组”组:
地图。删除(“无集团”);
//从头开始重新分配组名
设grpNo=1;
for(数组的组.from(map.values()).sort((a,b)=>a.date-b.date)){
让groupName=group.count>1?“组-”+grpNo++:“无组”;
for(让q为group.questions)q.group=groupName;
}
返回新组;
}
功能组(id){
返回问题。查找(q=>q.。\u id==id)。组;
}
//演示
常量问题=[
{{u id:1,q:'为什么?',组:'没有组',日期:'8',选择:false},
{{u id:2,q:'what?',group:'no group',date:'6',selected:false},
{{u id:3,q:'when?',group:'no group',date:'7',selected:false},
{{u id:4,q:'where?',group:'no group',date:'5',selected:false},
{{u id:5,q:'which?',group:'no group',date:'3',selected:false},
{{u id:6,q:'who?',组:'no group',日期:'0',所选内容:false},
{{u id:7,q:'为什么不?',组:'没有组',日期:'9',选择:false},
{{u id:8,q:'谁,我?',组:'没有组',日期:'4',选择:false},
{{u id:9,q:'waldo在哪里?',group:'no group',date:'1',selected:false},
{{u id:10,q:'哪条路是向上的?',组:'没有组',日期:'2',所选内容:false},
{{u id:11,q:'什么时候吃午饭?',组:'没有组',日期:'10',所选内容:false},
];
//一些行动。。。
分组选择问题([1,2,3]);
console.log(groupOf(1));//第一组
分组选择问题([4,5,6]);//成为第一组
console.log(groupOf(1),groupOf(4));//第2组,第1组
分组选择问题([6,9]);//成为第一组
console.log(groupOf(1)、groupOf(4)、groupOf(6));//第三组、第二组、第一组
分组选择问题([2,3,4]);//孤立id为1和5的条目

console.log(groupOf(1)、groupOf(4)、groupOf(5)、groupOf(6));//无组,第2组,无组,第1组
您的解组程序是什么?这种情况会一个接一个地发生吗?分组意味着不分配组。因此,如果您将1个Id传递给groupSelectedQuestions(),那么它将被标记为“无组”,从而取消分组。确定。您的
date
属性值是字符串。它们应该按字符串词法顺序排列吗?或者它们真的是数字吗?以数字的形式排列。它们只是一个用于简化的占位符。在生产代码中,它们是实际的日期。这太神奇了。我被困在这个问题上,这救了我。非常感谢。我只是不明白为何有人会在没有任何进一步解释的情况下否决这个问题。事实上,没有理由否决这个问题,我投了我的一票。