我正在学习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']
答案 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(", "));