Javascript 如何在嵌套数组上使用find()方法?

Javascript 如何在嵌套数组上使用find()方法?,javascript,find,Javascript,Find,在本例中,您可以看到find方法在该数组中运行良好: var库存=[ {名称:'苹果',数量:2}, {名称:'香蕉',数量:0}, {名称:'樱桃',数量:5} ]; log(inventory.find(fruit=>fruit.name=='cherries'); //{name:'cherries',quantity:5}您的代码不允许使用可选的类型数组。假设您希望执行深度优先搜索,则应将回调设为命名函数并递归使用,请参见注释: var库存=[ {名称:'苹果',数量:2}, {名称

在本例中,您可以看到find方法在该数组中运行良好:

var库存=[
{名称:'苹果',数量:2},
{名称:'香蕉',数量:0},
{名称:'樱桃',数量:5}
];
log(inventory.find(fruit=>fruit.name=='cherries');

//{name:'cherries',quantity:5}
您的代码不允许使用可选的
类型
数组。假设您希望执行深度优先搜索,则应将回调设为命名函数并递归使用,请参见注释:

var库存=[
{名称:'苹果',数量:2},
{名称:'香蕉',数量:0},
{名称:'樱桃',数量:5,类型:[
{名称:'rainier',数量:3},
{名称:'bing',数量:2}
]}
];
//定义函数
函数查找(数组、名称){
//循环此级别的条目
for(数组的常量项){
//如果我们找到了,就把它还给我
if(entry.name==name){
返回条目;
}
//如果没有,但有一个类型数组,则递归搜索它
if(Array.isArray(entry.type)){
const found=find(entry.type,name);
如果(找到){
//递归搜索找到它,返回它
发现退货;
}
}
}
//如果执行结束,它实际上是“返回未定义”`
}

log(find(inventory,'bing')
库存。find
将只在
库存中查找具有给定条件的数组元素,因为
{name:'bing',quantity:2}
库存中不存在,所以它将返回
未定义的
。您可以使用递归

var库存=[
{名称:'苹果',数量:2},
{名称:'香蕉',数量:0},
{名称:'樱桃',数量:5,类型:[
{名称:'rainier',数量:3},
{名称:'bing',数量:2}
]}
];
函数findFruitWithName(arr,name){
设x=arr.find(fruit=>fruit.name==name);
如果(x==未定义){
为了(让arr的果实){
if(水果类型){
设y=findFruitWithName(水果类型、名称);
如果(y!==未定义)返回y
}
}
}
否则返回x;
}
log(findFruitWithName(inventory,'bing'))
//未定义
//应为:{name:'bing',数量:2}

你说得对,
find
只查看数组中的元素,而不查看嵌套的元素,因此你必须创建自己的元素

您可以循环查看
库存中的所有项目
,收集潜在
类型
数组中的所有元素,并继续循环查看这些元素,直到找到具有所需
名称的项目为止,或者如果检查所有项目但未找到匹配项,则返回
未定义的

示例

const inventory=[
{名称:“苹果”,数量:2},
{名称:“香蕉”,数量:0},
{
名称:“樱桃”,
数量:5,
类型:[{name:“rainier”,数量:3},{name:“bing”,数量:2}]
}
];
函数findItem(库存,名称){
让项目=[…库存];
让项目;
while(items.length!==0){
item=items.pop();
如果(item.name==名称){
退货项目;
}else if(item.type){
items.push(…item.type);
}
}
返回未定义;
}
console.log(findItem(inventory,“bing”)试试这个

var inventory = [
    {name: 'apples', quantity: 2},
    {name: 'bananas', quantity: 0},
    {name: 'cherries', quantity: 5, type: [
       {name: 'rainier', quantity: 3},
       {name: 'bing', quantity: 2}
     ]}
];
var name = 'bing'
var result = inventory.find((fruit) => {
  if(fruit.name === name) return true
  if(fruit.type) return fruit.type.find(type=>type.name===name) 
  return false
})
console.log(result)
更新: 如果你想让它递归,你可以试试

函数查找(名称、清单){


很好,谢谢。我检查过了,即使数组更深入,它也能工作。谢谢。@EdgarsŠusts-不用担心!是的,这就是递归派上用场的地方。:-)
 return inventory.find((fruit) => {
  if(fruit.name === name) return true
  if(fruit.type) return find(name, fruit.type)
  return false
}) 
}
console.log(find(name,inventory))