如何获取嵌套对象中的所有名称?

时间:2018-05-17 18:18:58

标签: javascript

我正在学习JavaScript,我的老师让我做一个练习,返回一个包含该对象所有名称的数组:

{
  name: 'grandma',
  daughter: {
    name: 'mother',
    daughter: {
      name: 'daughter',
      daughter: {
        name: 'granddaughter'
      }
    }
  }
}

我的问题与此one类似,但解决方案对我不起作用,因为我的对象不包含任何数组。我到目前为止的代码:

    function toArray(obj) {
  const result = [];
    for (const prop in obj) {
        const value = obj[prop];
        if (typeof value === 'object') {
            result.push(toArray(value));
        }
        else {
            result.push(value);
        }
    }
    return result;
}

function nameMatrioska(target) {

return toArray(target);

}

打印出来:[ 'grandma', [ 'mother', [ 'daughter', [Array] ] ] ]

但我老师想要的是:['grandma', 'mother', 'daughter', 'granddaughter']

codepen

5 个答案:

答案 0 :(得分:0)

显然,您将数组推送到数组,其中所有嵌套的子项都显示为数组。

要解决此问题,您可以迭代数组并仅将单个项目推送到结果集。

另一种方法是使用一些与数组一起使用的内置技术,并返回一个没有嵌套数组的单个数组。

一些方法:

  • Array#concat,创建一个新数组。它也适用于较旧的Javascript版本。

    result = result.concat(toArray(value));
    
  • Array#push带有数组,Function#apply用于将数组作为参数列表。它适用于旧版本的JS。

    Array.prototype.push.apply(result, toArray(value));
    [].push.apply(result, toArray(value));              // needs extra empty array
    
  • Spread syntax ...用于将数组作为参数传播。 ES6

    result.push(...toArray(value));
    

    扩展语法是apply的强大替代品,具有更大的用途。请同时examples

最后是一个包含扩展语法的例子。

 function toArray(obj) {
    const result = [];
    for (const prop in obj) {
        const value = obj[prop];
        if (value && typeof value === 'object') { // exclude null
            result.push(...toArray(value));
            //          ^^^                          spread the array
        }
        else {
            result.push(value);
        }
    }
    return result;
}

function nameMatrioska(target) {
    return toArray(target);
}

var object = { name: 'grandma', daughter: { name: 'mother', daughter: { name: 'daughter', daughter: { name: 'granddaughter' } } } };

console.log(nameMatrioska(object));

答案 1 :(得分:0)

您需要.concat而不是.push。 Push将一个项添加到数组中; concat将两个数组连接在一起。

['grandmother'].concat(['mother', 'daughter'])
-> ['grandmother', 'mother', 'daughter']

push修改您调用它的数组不同,concat会创建一个新数组。

var a1 = [ 'grandmother' ];
a1.push( 'mother' );
console.log( a1 );
-> ['grandmother', 'mother']

var a2 = [ 'steve' ];
var result = a2.concat(['Jesus', 'Pedro']);
console.log( a1 );
-> ['steve']
console.log( result );
-> ['steve', 'Jesus', 'Pedro']

答案 2 :(得分:0)

试试这个

function toArray(obj) {
  var result = "";
    for (const prop in obj) {
        const value = obj[prop];
        if (typeof value === 'object') {
            result = result.concat(" " + toArray(value));
        }
        else {
            result = result.concat(value);
        }
    }

    return result; 
}

function nameMatrioska(target) {

return toArray(target).split(" ");

}

答案 3 :(得分:0)

function toArray(obj) {
  var result = [];

  for (var prop in obj) {
    var value = obj[prop];
    if (typeof value === 'object') {
      result = result.concat(toArray(value))
    } else {
      result.push(value);
    }
  }
  return result;
}

function nameMatrioska(target) {
  return toArray(target);
}

//USER
var names = {
  name: 'grandma',
  daughter: {
    name: 'mother',
    daughter: {
      name: 'daughter',
      daughter: {
        name: 'granddaughter'
      }
    }
  }
};

console.log(nameMatrioska(names));
//Output: ["grandma", "mother", "daughter", "granddaughter"]

答案 4 :(得分:0)

你真的很亲密 您必须在最后一步中展平您的阵列 提示:检查类型对象时通常要小心,例如null,undefined也是JavaScript世界中的对象!



function isObject(value) {
  if(value === undefined) return "Undefined";
  if(value === null) return "Null";
  const string = Object.prototype.toString.call(value);
  return string.slice(8, -1);
}

function collectPropertiesRec(object, propertyName) {
  const result = [ ];
  for(const currentPropertyName in object) {
    const value = object[currentPropertyName];
    if(isObject(value) === 'Object') {
        result.push(collectPropertiesRec(value, propertyName));
    }
    else if(currentPropertyName === propertyName) {
      result.push(value);
    }
  }
  return result;
}

function flattenDeep(arr1) {
    return arr1.reduce((acc, val) => Array.isArray(val) ? 	acc.concat(flattenDeep(val)) : acc.concat(val), [ ]);
  }

//USER
const names =  {
  name: 'grandma',
  daughter: {
    name: 'mother',
    daughter: {
      name: 'daughter',
      daughter: {
        name: 'granddaughter'
      }
    }
  }
};

var result = collectPropertiesRec(names, "name");
alert(flattenDeep(result).join(", "));