繁体   English   中英

在对象的属性和数组Javascript之间进行迭代有什么区别

[英]What is the difference between iterating between an object's properties and an array Javascript

我很难理解遍历数组与遍历对象属性之间的区别。

之间有什么区别?

for (key in object) {
DO THIS
} --> for objects

for (var i = 0 ; i<array.length ; i++) {
DO THIS
} --> for arrays

如果我想将对象的属性与数组中的值进行比较,可以在同一函数中同时遍历对象和数组。 例如,如下所示:

for (var key in object){
if (object.hasOwnProperty(key)){
  for (i=0 ; i<array.length; i++){
  if (object[key] === array[i]){   
    filteredKeys[key] = object [key]}

我的最终目标是编写一个函数,该函数接受一个对象和一个键数组,然后仅返回在数组中找到的键,然后返回一个新对象。

对象和数组是JavaScript中根本不同的数据结构。 对象是键值对的集合,而数组是数据的有序列表。

通过对象键进行迭代与通过数组进行迭代的不同之处在于,您正在访问另一种数据结构中的数据。

我的最终目标是编写一个函数,该函数接受一个对象和一个键数组,然后仅返回在数组中找到的键,然后返回一个新对象。

这可以通过执行以下操作来完成:

function filterObject(obj, keys) {
  var newObj = {};
  for (var i = 0; i < keys.length; i++) {
    if (keys[i] in obj) {
      newObj[keys[i]] = obj[keys[i]];
    }
  }
  return newObj;
}

例如,调用filterObject({'one': 1, 'two': 2}, ['one', 'three'])将产生结果{'one': 1}

您需要了解的是,数组只是具有特殊性质的特殊对象,其属性为数字(指示索引),而值则指示这些索引处的元素-它们具有与任何对象一样的键和值。 使用这样的for循环:

for(var i = 0; i < arr.length; i++) {
  arr[i]; //iterating through the array and accessing each element
}

您就像括号中的数字一样访问数字键,因为arr.0是无效的语法。 现在有了for ... in循环,您只需遍历对象的可枚举属性。 如我所说,数组的索引(意味着0、1、2等)只是数组对象的键! 因此,上面的for循环与此相同:

for(var i in arr) {
  arr[i];
}

因为数组的索引是键,所以它会遍历键(索引),因此您可以访问数组的元素。


要解决您的另一个问题-如果它们具有不同的键,则无法遍历具有相同循环的数组。 数组以数字索引作为键排序,对象的键可以是任何东西。 它们的键不一定相同,因此从数组和对象访问该键都不会产生正确的结果。

相反,如果要根据对象中的某些键是否在数组中来进行过滤,请尝试以下操作:

function filterKeysByArray(object, keys) {
  return keys.reduce((filteredObj, key) => {
    if(object.hasOwnProperty(key)) {
      filteredObj[key] = object[key];
    }
    return filteredObj;
  }, {});
}

这完全消除了嵌套的for循环。 它只会遍历传递的数组中的键,并将其简化为单个对象,即过滤对象。 它检查对象是否具有键指定的属性,如果包含,则将其添加到过滤的对象中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM