如何遍历数组并根据其数据类型提取元素



我试图从使用原生javascript的数组中提取所有对象。我一直得到一个对象作为值。我做错了什么?

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和/或箭头函数来做到这一点,但任何方法都有效。在这种情况下,我也不确定为什么要减少拼接。我从来没有真正理解过,我只知道很多例子都证明了这一点。如果有人能解释一下,我会很感激的。

每次在循环中都覆盖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的项。

通过另一种方式,重新编号的元素只是那些已经测试过的元素,所以您不会错过任何东西。

如果你可以使用ES5,那么在Array原型中有一个过滤器方法。

var person1 = { name: "Daniel Machado", life: true };
var person2 = { name: "Marla Singer", life: null };
var array = ["stg", person1, 1, null, person2];
var isObject = function(element) {
  return element && typeof element === "object";
}
console.log(array.filter(isObject));

相关内容

最新更新