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

时间:2017-07-02 04:40:12

标签: javascript arrays object

我无法理解迭代数组与迭代对象属性之间的区别。

有什么区别:

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]}

我的最终目标是编写一个函数,该函数接受一个对象和一个键数组,并返回一个只包含数组中的键的新对象。

2 个答案:

答案 0 :(得分:0)

对象和数组在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}

答案 1 :(得分:0)

你必须要理解的是,数组只是特殊对象,其属性是数字(表示索引),值表示这些索引处的元素 - 它们具有与任何对象一样的键和值。使用for这样的循环:

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

您只需通过bracket notation访问数字键,就像{{3}}一样,因为arr.0语法无效。现在使用for ... in循环,您只需遍历对象的可枚举属性。正如我所说,数组的索引(意思是0,1,2等)只是数组对象的关键!因此,上面的for循环与此相同:

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

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

要解决您的其他问题 - 如果对象具有不同的密钥,则无法使用相同的循环遍历对象。数组以数字索引作为键排序,对象&#39;钥匙可以是任何东西。它们的键不一定相同,因此从数组和对象访问该键将不会产生正确的结果。

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

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

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