javascript - 如何遍历数组并根据数据类型提取元素?

标签 javascript arrays loops typeof splice

我正在尝试使用 native javascript 从数组中提取所有对象。我一直得到一个对象作为值(value)。我做错了什么?

var person1 = { name: "Daniel Machado", life: true };
var person2 = { name: "Marla Singer", life: null };

var array = ["stg", person1, 1, null, person2];


function extractedObj(objToExtract){   
  for(var i = array.length-1; i--;){
    if (typeof array[i] === "object"){
      splicedObj = array.splice(i, 1);
    }
  }
  return splicedObj;
};

extractedObj(array);

// the result I'm looking for is: 
// [Object, Object]
// [person1, person2]

// the result I'm getting is:
// [Object]
// [person1]

输出只有一个对象。我想把他们都拉出来。理想情况下,我想使用 forEach 和/或箭头函数来执行此操作,但一切正常。不太确定为什么在这种情况下你必须减少 splice 。从来没有真正理解这一点,只知道许多例子都表明了这一点。如果有人能解释一下,我们将不胜感激。

最佳答案

您每次都在循环中覆盖 splicedObject。您需要将要删除的项目推送到结果数组中。

var person1 = { name: "Daniel Machado", life: true };
var person2 = { name: "Marla Singer", life: null };

var array = ["stg", person1, 1, null, person2];

function extractedObj(array){
  var splicedObj = [];
  for(var i = array.length-1; i >= 0; i--){
    if (typeof array[i] === "object" && array[i] !== null){
      splicedObj.push(array[i]);
      array.splice(i, 1);
    }
  }
  return splicedObj;
};
console.log(extractedObj(array));

之所以在拼接时需要递减,是因为它会调整你移除的元素之后的所有元素的索引。如果您正向遍历数组,则在删除元素 2 后,原为 3 的元素变为 2。下一次循环时,您会将 i 递增到 3,因此您永远不会检查取代旧 2 的项目>.

反过来,重新编号的元素只是已经测试过的元素,因此您不会遗漏任何内容。

关于javascript - 如何遍历数组并根据数据类型提取元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39176014/

相关文章:

javascript - Chrome 控制台中无效 - 奇怪的 SyntaxError : Unexpected token }

php - 如何在php中连接两个数组?

C#/ASP.NET 遍历表

java - 循环遍历 txt 文件,查找某个范围内的数字及其平均值

c# - Asp.Net:在服务器端恢复DropDownList的客户端SelectedItem

javascript - 如何从 PHP 将 JSON 传回我的 AJAX 请求?

javascript - 使用Sproutcore 1.6实现下拉列表

c - 读入未知大小的字符数组

javascript - 具有绑定(bind)值的数组过滤器

java - 我将如何使用 while 循环以及 if else 如果用户输入相同的输入两次并且它将再次尝试