Javascript 在数组中查找元素的最佳方法是什么?

Javascript 在数组中查找元素的最佳方法是什么?,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,我有一个病人列表的数组,他们都有唯一的id this.state = { patients = [ {id: "1", name: "Joe", age: 6, location: ''}, {id: "12", name: "Her", age: 2, location: ''}, {id: "1123", name: "Jin", age: 10, location: ''}, {id: "11234", name: "

我有一个病人列表的数组,他们都有唯一的id

 this.state = { 
  patients = [
        {id: "1", name: "Joe", age: 6, location: ''},
        {id: "12", name: "Her", age: 2, location: ''},
        {id: "1123", name: "Jin", age: 10, location: ''},
        {id: "11234", name: "Nick", age: 23, location: ''},
        {id: "12345", name: "Fil", age: 50, location: ''},
    ];
当用户单击按钮时,它会在回调中发送患者的唯一id和位置。然后,我使用唯一id在patients数组中查找患者并更新该患者的位置。我在数组中查找患者的方法是使用map在患者数组上循环,检查 patientId匹配数组中的id并添加该患者的位置。然而,地图总是会在每一页上都显示出来 patients数组中的patient也会执行不必要的循环&如果数组变大,那么循环成本会很高。我知道还有其他方法可以找到 数组,即findIndex方法,但它是否比映射更好?这个用例的最佳方法是什么

 <Button 
    id={location} 
    onClick={() => addPatientLocation(patientId, location}
 > 
    {location}
</Button>


你能用Map代替Array吗?它将更快地让患者通过id。
你能用地图代替数组吗?它将更快地让患者通过id。 您可以使用findIndex

let patients = [...this.state.patients]
let index = patients.findIndex(t=>t.id == patientId)
patients[index] = { ...patients[index], location: value }
this.setState({patients})
您可以使用findIndex

let patients = [...this.state.patients]
let index = patients.findIndex(t=>t.id == patientId)
patients[index] = { ...patients[index], location: value }
this.setState({patients})
我的例子利用了。我对findIndex和map函数进行了基准测试,见下面的结果。基准测试表明findIndex的速度要快得多

var t1=performance.now; 常数患者=[ {id:1,姓名:乔,年龄:6,地点:}, {id:12,姓名:她,年龄:2,地点:}, {id:1123,姓名:金,年龄:10,地点:}, {id:11234,姓名:尼克,年龄:23,地点:}, {id:12345,姓名:菲尔,年龄:50,地点:}, ]; const index=patients.findIndexelem=>elem.id==11234; 患者[索引]。位置=位置; 对照组:对数患者[指数]; var t2=性能。现在; 控制台日志时间消耗,t2-t1 我的例子利用了。我对findIndex和map函数进行了基准测试,见下面的结果。基准测试表明findIndex的速度要快得多

var t1=performance.now; 常数患者=[ {id:1,姓名:乔,年龄:6,地点:}, {id:12,姓名:她,年龄:2,地点:}, {id:1123,姓名:金,年龄:10,地点:}, {id:11234,姓名:尼克,年龄:23,地点:}, {id:12345,姓名:菲尔,年龄:50,地点:}, ]; const index=patients.findIndexelem=>elem.id==11234; 患者[索引]。位置=位置; 对照组:对数患者[指数]; var t2=性能。现在;
控制台日志时间消耗,t2-t1;如果在设置状态后多次使用“查找”操作。可以将数组转换为具有patients={id:}的对象。然后每个搜索都将是O1,否则您将不得不进行线性搜索。请检查此链接以使用Array.find并不要忘记检查我可以使用它来确定您需要polyfill还是NotLocation!==位置如果在设置状态后多次使用查找操作。可以将数组转换为具有patients={id:}的对象。然后每个搜索都将是O1,否则您将不得不进行线性搜索。请检查此链接以使用Array.find并不要忘记检查我可以使用它来确定您需要polyfill还是NotLocation!==locationmap构造一个新数组,而findIndex不构造一个新数组map构造一个新数组,而findIndex不构造一个新数组@Andy我以为他担心当数组变大时会在整个数组上循环,尽管这是不可能的,因为数组几乎无法达到数百万个元素来影响他的表演code@Andy我认为当数组变大时,他会担心在整个数组上循环,尽管这是不可能的,因为数组几乎不能达到数百万个元素,从而影响他的代码的性能结果不一致使用映射时间消耗14.1299995930121.99499987147748用于findIndex@muddassir如果您多次运行它,您的结果将被缓存。但是,即使您在重新加载页面时多次运行findIndex,findIndex也总是比map快!使用map时间消耗1.9999987147748的结果与使用map时间消耗14.1299999593012的结果不一致findIndex@muddassir如果您多次运行它,您的结果将被缓存。但是,即使您在重新加载页面时多次运行findIndex,findIndex也总是比map快!