如何遍历数组并根据数据类型提取元素?
How do you iterate over an array and extract elements based on their data type?
我正在尝试使用本机 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 and/or 箭头函数来执行此操作,但任何方法都有效。不太确定为什么在这种情况下你必须减少 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
的项目。
反过来,重新编号的元素只是已经测试过的元素,所以您不会错过任何东西。
如果你可以使用 ES5,数组原型中有一个 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));
我正在尝试使用本机 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 and/or 箭头函数来执行此操作,但任何方法都有效。不太确定为什么在这种情况下你必须减少 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
的项目。
反过来,重新编号的元素只是已经测试过的元素,所以您不会错过任何东西。
如果你可以使用 ES5,数组原型中有一个 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));