我无法理解迭代数组与迭代对象属性之间的区别。
有什么区别:
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]}
我的最终目标是编写一个函数,该函数接受一个对象和一个键数组,并返回一个只包含数组中的键的新对象。
答案 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循环。它只会遍历传递的数组中的键,并将其缩减为单个对象,即过滤的对象。它检查对象是否具有键指定的属性,如果有,则将其添加到过滤的对象中。