【问题标题】:How do you iterate over an array and extract elements based on their data type?如何迭代数组并根据数据类型提取元素?
【发布时间】:2017-01-03 16:47:59
【问题描述】:

我正在尝试使用原生 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 和/或箭头函数来做到这一点,但任何事情都可以。也不确定为什么在这种情况下你必须减少拼接。从来没有真正理解这一点,只知道这就是许多例子所显示的。如果有人可以解释,将不胜感激。

【问题讨论】:

    标签: javascript arrays loops typeof splice


    【解决方案1】:

    您每次循环都会覆盖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 的项目。

    反过来说,被重新编号的元素只是已经测试过的元素,所以你不会错过任何东西。

    【讨论】:

    • 啊,你需要把它推进去,不要覆盖。谢谢!
    • 我已经添加了一个解释,说明为什么你必须向后遍历数组。
    • 在我最后一年的编码中看到了很多这个例子,只是从来没有 100% 理解为什么会这样。我现在知道了。再次感谢。
    • 我认为你有几个问题,实际上:函数参数名称与函数内部使用的引用不匹配;循环测试使其跳过索引 0;和typeof null === "object",所以它会匹配null,而所需的输出不包括它。
    • 我在测试时也注意到了这一点。它仍然不能完全按照我的希望运行。我正在尝试返回多个对象(与数组中的一样多)。如果设置了正确的值,它将拉出多个字符串和数字,但它只返回一个对象。关于如何使其返回多个的任何指针?
    【解决方案2】:

    如果你可以使用 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));

    【讨论】:

    • 这是一个不错的小方法,一定会记住这一点。而且,我可以使用箭头函数!耶,谢谢。
    • 还有一个问题,因为我喜欢真正了解要改进的地方,而不仅仅是复制粘贴,为什么它会返回 element && typeof 元素?为什么不只返回 typeof 元素?那里发生了什么?刚刚学了一点过滤器,这就是我问的原因。
    • typeof null 是对象,所以 element && ... 检查过滤掉空值。请注意,它仍将包含空对象{}
    • 了解非常有用。空对象很好,只是不能有空或未定义。这是一个毫无意义的小库项目,我试图从数组中提取值,以便我可以通过扩展运算符将数组中的数字提供给 Math.max。会记住 null 的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多