我有一个数字数组,我希望得到的第一个数字小于特定的x,然后首先得到的数字大于相同的x。
var str = 'some random string that is kind of long',
items = [],
position = 10, //varies
itemsBefore,
itemsAfter,
firstItemBeforePosition,
firstItemAfterPosition; //varies
for(var i = 0, length= str.length; i < length; i++){
if(str[i] === ' '){
items.push(i);
}
}
itemsBefore = items.filter(function(item){
return item < position;
});
itemsAfter = items.filter(function(item){
return item > position;
});
firstItemBeforePosition = itemsBefore.length > 0 ? itemsBefore[itemsBefore.length - 1] : 0;
firstItemAfterPosition = itemsAfter.length > 0 ? itemsAfter[0] : str.length;
根据我提供的JavaScript代码,items数组将为[4, 11, 18, 23, 26, 31, 34]
,firstItemBeforePosition
为4,firstItemAfterPosition
为11。
有更好的方法吗?
谢谢。
答案 0 :(得分:2)
这是另一种方法,它需要更少的代码,不会循环整个列表。它还使用少量变量并使用更多本机代码函数(应该更快)。
var str, array, length, firstItemBeforePosition, firstItemAfterPosition;
str = 'some random string that is kind of long';
length = 0;
position = 10;
array = str.split(' ');
array = array.map( function( s, i ){ length += s.length; return length+i })
array.some(function(e){
if ( e < position ) firstItemBeforePosition = e;
if ( e > position ) {
firstItemAfterPosition = e;
}
return firstItemAfterPosition;
});
某些功能在1.6版(ES5)的Javascript中,可以在IE9 +中使用。与for循环或forEach不同,只要回调函数返回truthy值,某些方法就会返回。因为firstItemAfterPosition
在我们启动它时是假的,所以有些会继续运行,直到我们为它分配一个值,它将在什么时候变得真实而有些将退出。
如果位置值列表真的很长,我建议查看binary search,因为它将是O(log n)而不是O(n)。如果您不知道这意味着您的问题大小可能足够小,您不必担心:)
答案 1 :(得分:1)
一个简单的循环应该这样做:
for(var k = 0; k < items.length; k++)
{
if (items[k] > position)
{
firstItemAfterPosition = items[k];
firstItemBeforePosition = items[k-1];
break;
}
}