JavaScript - 检查对象的属性是否为数组

时间:2015-11-22 22:43:34

标签: javascript

我有以下对象:

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
      });
    }
  }
}

2 个答案:

答案 0 :(得分:3)

您想要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));
}

答案 1 :(得分:0)

两个错误

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

其次,prop是关键,所以它永远不会是一个数组

更正的代码是

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