首先让我解释一下我想要的东西。好吧,我有一个像这样的排序数组
var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];
现在我需要删除字符串长度小于5的所有元素。好的,现在我的观点是,是否有任何最简单的方法来查找字符串长度为4的元素的索引。这里有两个元素包含字符串长度但我需要最后一个。如果可以获得该索引我可以申请
arr.splice(0, (index+1));
有一件事,我的原始数组包含100万个数据。现在我该如何解决这个问题?
答案 0 :(得分:2)
虽然filter()
是最简单的方法,但使用简单的for循环来查找长度为4(或者其他)的最后一个元素的索引并执行单个slice()
会更有效率得到结果。特别是如果元素的数量>长度4很大。
var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"],
lastIndex = false;
// find the number of elements to be removed
for ( var i = 0; i < arr.length; i++ ) {
if ( arr[i].length >= 5 ) {
lastIndex = i;
break; // break out of the loop
}
}
// one single splice to get the result
arr.splice(0, lastIndex);
// arr is now ["abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"]
这是一个performance comparison过滤器和循环&amp;拼接(上图)策略。正如您所看到的,上述方法在过滤器之前是跳跃式的。
答案 1 :(得分:2)
您可以使用数组过滤器删除元素。
var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];
arr = arr.filter(function(item) {
return item.length > 4;
});
//["abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"]
我不知道你在数组中有一百万个项目,但也许你可以尝试在服务器中减少该数组,然后再将它发送到客户端。 (我不确切知道你的数据来自哪里,但这是一个javascript数组的大量数据);
答案 2 :(得分:1)
尝试这样的事情
删除长度小于5的所有元素
var arrFiltered = arr.filter(function(element){ return element.length>=5});
获取长度为4的最后一个元素的索引
var lastId = 0;
var filteredElements = arr.filter(function(e){
return e.length === 4;
};
lastId = filteredElement[filteredElement.length-1]?arr.indexOf(filteredElement.pop());
答案 3 :(得分:1)
好的方面是你的数组按长度排序,坏的是你有100,000多个元素的数组。
字符串上的正则表达式比循环数组更快(特别是在100k +元素的情况下)
您可以使用正则表达式获取具有指定长度的最后一个元素,然后您可以使用索引在数组上使用splice
。
join
n
splice
使用此索引的原始数组
var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];
var matches = arr.join(",").match(/\b[a-z]{5}\b/ig) || [];
arr.splice(0, arr.lastIndexOf(matches[matches.length - 1]) + 1);
console.log(arr);
document.write(arr);
&#13;
正则表达式解释
\b
:Word Boundary [a-z]
:匹配所有字母{n}
:完全匹配上一课n次i
:非常敏感的匹配g
:全球,获取所有比赛二进制搜索
您还可以使用二进制搜索将数组拆分为两个相等的子数组,并在单个子数组中搜索具有指定长度的最后一个元素。然后使用此元素获取它的索引,然后拼接原始数组。
搜索算法由Binary Search in Javascript
提供
var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];
var copy = arr.slice();
function binarySearch(arr, len) {
var mid = Math.floor(arr.length / 2);
console.log(arr[mid], len);
if (arr[mid].length === len && arr[mid + 1].length === len) {
console.log('match', arr[mid], len);
return binarySearch(arr.splice(mid));
} else if (arr[mid].length === len) {
return arr[mid];
} else if (arr[mid].length < len && arr.length > 1) {
console.log('mid lower', arr[mid], len);
binarySearch(arr.splice(mid, Number.MAX_VALUE), len);
} else if (arr[mid].length > len && arr.length > 1) {
console.log('mid higher', arr[mid], len);
binarySearch(arr.splice(0, mid), len);
} else {
console.log('not here', len);
return -1;
}
}
var result = binarySearch(copy, 5);
arr.splice(0, arr.lastIndexOf(result) + 1);
console.log(arr);
document.write(arr);
&#13;
答案 4 :(得分:1)
尝试使用do.. while
循环
do {
arr.splice(0,1)
} while (arr[0].length < 5)
答案 5 :(得分:1)
根据Tushar的评论,如果数组已经排序,那么有一种更有效的lodash方法:
arr = _.takeWhile(arr, function(element){ return element.length < 5; });
---老appaorch ---
您可以使用lodash来做到这一点,干净又简单:
arr = _.filter(arr, function(element){return element.length < 5; };
var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];
// arr = _.filter(arr, function(element){return element.length < 5; });
arr = _.takeWhile(arr, function(element){ return element.length < 5; });
alert('filtered array: ' + arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>
答案 6 :(得分:1)
我们也可以使用jquery的.grep函数,如bellow
var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"],
arr=$.grep(arr,function (obj,i){
return obj.length > 4
})
console.log('value is'+arr);
它通常也用于从数组中过滤