按元素类型从数组中删除元素
Remove elements from array by type of element
我有一个数组,我想从中删除所有字符串元素。这就是我目前所拥有的。结果不是我想要的,因为它只返回"自行车"
另外,我在测试完成中执行此操作,因此我需要有一个记录结果的主函数。
function ex06(){
var mailBox = "mailbox";
var twenty = 20;
var isItRaining = true;
var goat = "";
var stringsArray = ["bicycle", "pocket", 3, mailBox, twenty, isItRaining, goat];
var result = removeStrings();
Log.Message("stringsArray looks like this after the removal of all the string elements: " + result);
function removeStrings(){
var i;
var x
for(i = 0; i < stringsArray.length; i++){
if (typeof(stringsArray[i]) === 'string'){
x = stringsArray.splice(i, 1);
return x;
}
}
}
}
版本 1,带有 Array#filter
var a = [1, 2, "3", "4", true];
a = a.filter(function (e) {
return typeof e !== 'string';
});
document.write('<pre>' + JSON.stringify(a, 0, 4) + '</pre>');
版本 2,带有 Array#splice 并向后运行。
var a = [1, 2, "3", "4", true],
i = a.length;
while (i--) {
if (typeof a[i] === 'string') {
a.splice(i, 1);
}
}
document.write('<pre>' + JSON.stringify(a, 0, 4) + '</pre>');
Array.prototype.filter 方法是你需要的:
var stringsArray = ["bicycle", "pocket", 3, mailBox, twenty, isItRaining, goat];
var result = stringsArray.filter(function(element) {
return typeof element !== 'string';
});
您需要减少counter
变量并检查原始数组
试试这个简单的例子
var a = [1,2,"3", "4", true];
for( var counter = 0; counter < a.length; counter++)
{
if ( (typeof a[ counter ] ) == "string" )
{
a.splice(counter,1); counter--;
}
}
console.log(a); //output [1, 2, true]
试试这段代码:
function ex06(){
var mailBox = "mailbox";
var twenty = 20;
var isItRaining = true;
var goat = "";
var stringsArray = ["bicycle", "pocket", 3, mailBox, twenty, isItRaining, goat];
var result = removeStrings();
Log.Message("stringsArray looks like this after the removal of all the string elements: " + result);
function removeStrings(){
var newarray = [];
var i;
var x
for(i = 0; i < stringsArray.length; i++){
if (typeof(stringsArray[i]) !== 'string'){
newarray.push(stringsArray[i]);
}
}
return newarray
}
}
JavaScript 提供了原生方法来过滤数组,因此您可以更轻松地删除字符串元素:Array.prototype.filter 可以使该过程变得容易得多(并且可以防止在循环中使用拼接时的奇怪行为)。
function ex06(){
var mailBox = "mailbox";
var twenty = 20;
var isItRaining = true;
var goat = "";
var stringsArray = ["bicycle", "pocket", 3, mailBox, twenty, isItRaining, goat];
var result = removeStrings(stringsArray);
Log.Message("stringsArray looks like this after the removal of all the string elements: " + result);
function removeStrings(arrayWithString){
return arrayWithString.filter(function(item) {
return typeof item !== 'string'; // returns only items which are not strings
});
}
}
一小段建议:将数组传入函数,而不是从父范围引用它。这样你就有一个纯粹的、可重用的功能(并且没有你可能不想要的奇怪的副作用)。
我认为这是一个练习,这就是为什么你不使用Array#filter
。
问题是您的return x
在for
循环中,因此返回找到的第一个字符串。
您至少有三个选项:
-
不要返回任何内容,因为
removeStrings
正在修改原始数组。这很简单:只需删除return x;
行即可。 -
不要修改原始数组;相反,创建并返回一个省略字符串的新数组。在这种情况下,您将在循环之前从
x = []
开始,删除splice
调用,然后将任何非字符串推送到x
上。 -
修改原始数组,然后创建并返回包含已删除字符串的新数组。在这种情况下,您将从循环内部删除
return x
,在循环之前x = []
,然后将您删除的条目推送到x
上。然后在最后return x
。
在修改原始条目的任何地方,请注意 gurvinder372 的观点,即当您删除条目时,您不需要增加索引计数器,因为您最终会跳过下一个条目。
不过,我不会按照他建议的方式去做;当我循环访问修改它的数组时,for
不是我想要的,我会伸手去while
:
i = 0;
while (i < stringsArray.length) {
if (typeof stringsArray[i] === 'string'){
stringsArray.splice(i, 1);
// We leave `i` alone here, because we need to process
// the new `stringsArray[i]` on the next pass
} else {
// Didn't remove this entry, move past it
++i;
}
}
旁注:typeof
不是一个函数,它是一个运算符,没有必要将其操作数放在 ()
:
if (typeof stringsArray[i] === 'string'){
- 删除对HTML元素的拖动
- 如何覆盖锚点元素's href目标,并在我点击转到目标javascript时删除其他错误
- 从所有元素中删除HTML5验证
- 如何检查元素的内容是否为空,如果为空,请在jquery中删除该元素
- 从组件状态的数组中删除元素
- angularjs删除动态形式元素中的特殊字符
- Mongoose-在更新中删除数组元素
- 从数组中删除元素的最佳方法是:javascript/jquery
- 删除不起作用的父元素和所有子元素
- 一些元素没有从数组中删除
- 正在尝试删除子元素的最后一个子元素
- JavaScript-如何按类查找元素并删除此类
- 正则表达式条件来删除元素
- Small Javascript从动态表单中删除多个元素的问题
- javascript:在元素删除后停止setInterval
- JQUERY:动态 AJAX 和 html 元素删除
- AngularJS ngRepeat元素删除
- AngularJS & lt; select>使用ng-model和ng-options在元素删除时被破坏
- jQuery UI datetimepicker绑定到错误的输入后DOM元素删除
- 防止 jQuery 在元素删除时取消绑定事件