JavaScript-检查对象'的属性是一个数组

JavaScript - check if object's property is an array

本文关键字:数组 一个 属性 对象 检查 JavaScript-      更新时间:2023-09-26

我有以下对象:

const foo = {
   prop1: 'I am a string',
   prop2: [
           { prop2_1: 'I am a sub string' },
           { prop2_2: 'I am a sub string' },
   ],
   prop3: 'I am a string',
   prop4: [
           { prop4_1: 'I am a sub string' },
           { prop4_2: 'I am a sub string' },
   ],
}

在JavaScript(即不是jQuery)中,我如何循环遍历foo的属性并确定它的任何属性是否是数组?我尝试了这个,但没有运气:

for (const prop in foo) {
  if (prop!== undefined) {
    if (Object.prototype.toString.call(prop) === '[object Array]') {
      prop.map((child) => {
          // do something
      });
    }
  }
}

您需要Array.isArray

您可能需要对此进行填充。

非递归

Object.keys(foo).some((k) => Array.isArray(foo[k]));

递归

function containsArr(o) {
    for (var k of Object.keys(o)) {
        if (recursive(o[k])) {
            if (containsArr(o[k])) {
                return true;
            }
            continue;
        }
        if (Array.isArray(o[k])) {
            return true;
        }
    }
    return false;
}
// We recurse into functions 
// and plain objects.
function recursive(o) {
    return /^'[object (Object)| (Function)']/
      .test(Object.prototype.toString.call(o));
}

两个错误

首先,const-prop将失败,因为const是常量

其次,道具是关键,所以它永远不会是阵列

校正后的代码是

for (let prop in foo) {
  if (foo.hasOwnProperty(prop)) {
    if (Object.prototype.toString.call(foo[prop]) === '[object Array]') {
      foo[prop].map((child) => {
          // do something
      });
    }
  }
}