我正在尝试使用本机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和/或箭头函数执行此操作,但任何工作都可以。在这种情况下,不确定为什么你必须减少拼接。从来没有真正明白这一点,只知道这是许多例子所展示的。如果有人能够解释它会受到赞赏。
答案 0 :(得分:3)
每次循环都会覆盖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
的项目。
通过另一种方式,重新编号的元素就是那些已经过测试的元素,所以你不会错过任何东西。
答案 1 :(得分:1)
如果你可以使用ES5,那么在Array原型中有一个filter方法。
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));