Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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 函数findOne,将数组和查询作为输入,并在包含查询的数组中查找对象_Javascript - Fatal编程技术网

Javascript 函数findOne,将数组和查询作为输入,并在包含查询的数组中查找对象

Javascript 函数findOne,将数组和查询作为输入,并在包含查询的数组中查找对象,javascript,Javascript,我必须编写一个函数,在对象数组中搜索查询并返回与查询匹配的第一个对象。 例如,阵列的外观如下所示: const HEROES = [ { id: 1, name: 'Captain America', squad: 'Avengers' }, { id: 2, name: 'Iron Man', squad: 'Avengers' }, { id: 3, name: 'Spiderman', squad: 'Avengers' }, ]; 对函数的调用类似于 findOne(HEROES

我必须编写一个函数,在对象数组中搜索查询并返回与查询匹配的第一个对象。 例如,阵列的外观如下所示:

 const HEROES = [
{ id: 1, name: 'Captain America', squad: 'Avengers' },
{ id: 2, name: 'Iron Man', squad: 'Avengers' },
{ id: 3, name: 'Spiderman', squad: 'Avengers' },
 ];
对函数的调用类似于

 findOne(HEROES, {id :1 }) => id:1, name: 'Captain America', squad: 'Avengers' }
我已经试过做一个for循环,检查每个案例的query.id是否等于arr[I].id等,但是我无法让它工作,因此如果输入是两个查询,比如id:4和band:“Justice League”,我将无法得到正确的结果。有些是对的,但有些是错的。Idk这有点难以解释

function findOne(arr, query){
  let i = 0;
   while (i<arr.length){
   if (Object.values(query) in Object.values(arr[i])){  
    return arr[i];
  }
  i++;
}
}
函数findOne(arr,查询){
设i=0;
而(i
const英雄=[
{id:1,名字:'美国队长',小队:'复仇者'},
{id:2,名字:'钢铁侠',小队:'复仇者'},
{id:3,名字:'蜘蛛侠',小队:'复仇者'},
];
函数findOne(arr,query){
设i=0;
让result=“未找到”;
而(iconsole.log(result);
因此,这里的问题是查询在字段中发生了变化,例如,您不知道在查询对象中得到了哪些字段(如果我没有弄错的话)

使用
Object.values(query)
不是最好的方法,因为这样的查询也可以通过测试并返回第一个英雄:
{id:'Avengers',name:1}

使用
对象。键

function findOne(arr, query){
  let keys = Object.keys(query);
  while(i<arr.length){
     let equalKeyCounter = 0;
     for( key in keys ){
        if(query[key] === arr[i][key])
          equalKeyCounter++;
     }
     if( equalKeyCounter == keys.length )
        return arr[i];
  }
   return "not found"; // or null , undefined, any other default value
}
函数findOne(arr,查询){
让keys=Object.keys(查询);

而(我只是添加了一个ES6答案

ES6中的代码类似于:

const result = HEROES.find(hero => 
  Object.entries(query).every(([key,value]) => key in hero && hero[key] === value))
它基本上返回
英雄
数组中与给定的
查询
对象中的道具匹配的第一项。如果要创建函数,可以是:

const find = (items, query) => items.find(item => 
  Object.entries(query).every(([key,value]) => key in item && item[key] === value))
通过简单的方法更改,您还可以使用一个函数返回与查询匹配的所有项,而不仅仅是第一项:

const findAll = (items, query) => items.filters(item => 
  Object.entries(query).every(([key,value]) => key in item && item[key] === value))
它始终返回一个新数组–如果没有与
query
的道具匹配的项目,则为空。 例如,使用您的数据:

   console.log(find(HEROES, {squad: 'Avengers'}));
   // { id: 1, name: 'Captain America', squad: 'Avengers' } 

   console.log(find(HEROES, {squad: 'Avengers'}));
   // [
   //   { id: 1, name: 'Captain America', squad: 'Avengers' },
   //   { id: 2, name: 'Iron Man', squad: 'Avengers' },
   //   { id: 3, name: 'Spiderman', squad: 'Avengers' },
   // ]
相同的查询,但由于第二个函数返回所有匹配项,因此有多个结果

希望有帮助!
在这里,您可以找到有关所用方法的更多信息:,。

示例函数调用
findOne(HEROES,{id:1})=>id:1,name:'Captain America',band:'Avengers}
的语法无效