所以我有以下数组:
let array = ['9h00','9h30','9h45','10h00','10h15']
我想说我想在'9h15'
'9h00' && '9h30'
如何在快速和快速的情况下做到这一点?有效的解决方案?
编辑:我一直不清楚,插入的索引会根据数组而改变。它永远不会成为以下职位:array[1]
。
提前致谢!
答案 0 :(得分:1)
如果每个项目的格式都相同string_io = stdout_helpers.redirect()
,那么我们可以执行以下操作:
首先我们需要一个函数将字符串转换为一个对象或我们可以使用的东西,我将使用一个对象:
(\d?\d)h(\d{2})
然后我们需要确保对数组进行排序,例如function timeStringToObj(str){
var re = "^(\d?\d)h(\d\d)$";
var h = str.replace(re, "$1");
var m = str.replace(re, "$2");
return {
hours: parseInt(h),
minutes: parseInt(m)
};
}
< "9h15"
因此"9h16"
的索引是< "9h15"
的索引,(如果没有使用"9h16"
)并循环查找点(我当然会使用函数),我会将你的数组视为全局变量:< / p>
array.sort(/*some sorting function if necessary*/)
如果您对我对/**
*@param timeObjA an object that is the return value of a call of timeStringToObj
*@param timeObjB an object that is the return value of a call of timeStringToObj
*/
function AgeB(timeObjA, timeObjB){//A greater than or equal to B
return (timeObjA.hours >= timeObjB.hours && timeObjA.minutes >= timeObjB.minutes);
}
/**
*@param a an object that is the return value of a call of timeStringToObj
*@param b an object that is the return value of a call of timeStringToObj
*/
function AleB(a, b){//A less than or equal to B
return (timeObjA.hours <= timeObjB.hours && timeObjA.minutes <= timeObjB.minutes);
}
function putInTimeArray(str){
var val = timeStringToObj(str);
for(let i = 0 ; i < array.length ; i+=1){
var curr = timeStringToObj(array[i]);
//first check : elem >= last
if( AgeB(val, curr) && i===(array.length-1) ){
array.push(str);
return true;
}
//second check : elem <= first
if( AleB(val, curr) && i===0 ){
array.unshift(str);
return true;
}
//last check : first < elem < last
if(i!=0 && i!=(array.length - 1)){
if(AgeB(val, curr)){
array.splice(i+1,0,str);
return true;
}
if(AleB(val, curr){
array.splice(i-1,0,str);//here i-1 is safe since i!=0 (condition)
return true;
}
}//end of last check
}//end of for-loop
}//end of function
的使用有疑问,请参阅:How to insert an item into an array at a specific index?
修改
你可能需要一个更复杂的正则表达式才能更合适如果你不那么疯狂地使用这些字符串就能完成这项工作
答案 1 :(得分:-1)
你可以推送和排序:
while(loopTask != null)
{
if(loopTask.Data is BusinessTask) // assuming BusinessTask derives from BaseTask
{
var clone = loopTask.Clone();
// clone contains the same BusinessTask, but it's position in the new list
// won't mess up the old list.
busList.AddSorted(clone);
}
loopTask = loopTask.next;
}