Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将嵌套对象数组筛选为对象数组_Javascript_Arrays - Fatal编程技术网

Javascript 将嵌套对象数组筛选为对象数组

Javascript 将嵌套对象数组筛选为对象数组,javascript,arrays,Javascript,Arrays,我有一个嵌套的对象数组。如何创建一个对象数组,该数组同时从嵌套属性中获取值?如果onClick属性为空,则表示有一个名为children的属性,父元素不应是新列表的一部分。我需要遍历子数组并获取值。请参阅下面的预期输出 const头=[{ 标题:“阿伦”, id:'阿鲁尼', onClick:“onClickArun” }, { 标题:“乔治”, id:'乔治', onClick:“”, 儿童:[{ 标题:“大卫”, id:'大卫做的', onClick:“onClick大卫” }, { 标题

我有一个嵌套的对象数组。如何创建一个对象数组,该数组同时从嵌套属性中获取值?如果onClick属性为空,则表示有一个名为children的属性,父元素不应是新列表的一部分。我需要遍历子数组并获取值。请参阅下面的预期输出

const头=[{
标题:“阿伦”,
id:'阿鲁尼',
onClick:“onClickArun”
},
{
标题:“乔治”,
id:'乔治',
onClick:“”,
儿童:[{
标题:“大卫”,
id:'大卫做的',
onClick:“onClick大卫”
},
{
标题:“帕特里克”,
id:“patrickId”,
onClick:“onClickPatrick”
}
]
},
{
标题:"马克",,
id:'markId',
onClick:“onClickMark”
}
];
console.log(headers.map)(项=>{
返回{
标题:item.title,
onClick:item.onClick
}
}))
您可以使用递归回调进行调用

const
map=({title,onClick,children})=>onClick
? {title,onClick}
:children.map(地图);
var headers=[{title:'Arun',id:'arunId',onClick:'onClickArun'},{title:'George',id:'geogeid',onClick:'onClickDavid'},{title:'Patrick',id:'patrickId',onClick:'onClickPatrick'}},{title:'Mark id:'markId:'markId',onClick:'onClickMark,
结果=标题.flatMap(map);
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
您可以使用
Array.prototype.reduce
,在这里您只需要检查父
onClick
道具是否为空,子
道具是否存在:

var headers=[{title:'Arun',id:'arunId',onClick:'onClickArun'},{title:'George',id:'georgeId',onClick:'',children:[{title:'David',id:'onClickDavid',onClick:'Patrick'},{title:'Mark id:'markId:'onClickDavid onClick'},{title:'Mark;
函数getObject(标题,acc){
返回标题。减少((acc,ele)=>{
if(!ele.onClick.length&&ele.children){
acc=getObject(ele.children,acc);
}否则{
acc.push({“title”:ele.title,“onClick”:ele.onClick});
}
返回acc;
},acc);
}

log(getObject(headers,[])看起来您需要进行深度优先搜索。 在数组上运行,对于每个具有子项的项,将在其上递归并传递现有数组。否则,将该项添加到列表中

function getChildren(array, total = []){
  for(let item of array) {
    if(item.children) {
      getChildren(item.children, total)
    } else {
      total.push({
        title: item.title,
        onClick: item.onClick
      })
    }
  }
  return total
}
let头=[{
标题:“阿伦”,
id:'阿鲁尼',
onClick:“onClickArun”
},
{
标题:“乔治”,
id:'乔治',
onClick:“”,
儿童:[{
标题:“大卫”,
id:'大卫做的',
onClick:“onClick大卫”
},
{
标题:“帕特里克”,
id:“patrickId”,
onClick:“onClickPatrick”
}
]
},
{
标题:"马克",,
id:'markId',
onClick:“onClickMark”
}
]
//仅当onClick为空时,才使用children
.map(item=>item.onClick?item:item.children)
//做平面阵列
标题=[].concat.apply([],标题)
.map(项=>{
常数temp={};
temp.title=item.title;
temp.onClick=item.onClick;
return temp;//仅从每个项获取onClick和title属性
})

回答得很好,但是您的解决方案没有考虑嵌套的子项。@YuriKhomyakov是的,很抱歉,如果忘记添加此处需要的递归步骤。