在Javascript中,替换forEach,它涉及每次通过带有左连接的循环过滤相同的对象数组

在Javascript中,替换forEach,它涉及每次通过带有左连接的循环过滤相同的对象数组,javascript,reactjs,ecmascript-6,data-manipulation,Javascript,Reactjs,Ecmascript 6,Data Manipulation,标题有点罗嗦,但我在下面创建了一个相当好的示例,突出了我的目标: // the array that is being JOINED onto the the main array var playerArray = [ { id: 'tom', num: 34, age: 12 }, { id: 'joe', num: 24, age: 14 }, { id: 'bim', num: 14, age: 15 }, { id: 'tim', num: 43, age: 16 }

标题有点罗嗦,但我在下面创建了一个相当好的示例,突出了我的目标:

// the array that is being JOINED onto the the main array
var playerArray = [
  { id: 'tom', num: 34, age: 12 }, 
  { id: 'joe', num: 24, age: 14 },
  { id: 'bim', num: 14, age: 15 },
  { id: 'tim', num: 43, age: 16 },
  { id: 'nik', num: 10, age: 17 },
  { id: 'jib', num: 12, age: 87 }
];

// the main array      
var dataArray = [
  { name: 'tom', pts: 24, team: 'bozos', city: 'detroit' },
  { name: 'joe', pts: 14, team: 'bozos', city: 'chicago' },
  { name: 'bim', pts: 34, team: 'kazos', city: 'milkway' },
  { name: 'tim', pts: 51, team: 'kazos', city: 'dragzon' }
];

// loop each row in dataArray, find players number in playerArray, add to dataArray
let thisNum;
dataArray.forEach((currVal, idx, thisArray) => {
  thisNum = playerArray
    .filter(thisP => thisP.id === currVal.name)
    .map(thisP => thisP.num)[0];

  thisArray[idx].num = thisNum;
});

console.log('dataArray: ', dataArray);
0: {name: "tom", pts: 24, team: "bozos", city: "detroit", num: 34}
1: {name: "joe", pts: 14, team: "bozos", city: "chicago", num: 24}
2: {name: "bim", pts: 34, team: "kazos", city: "milkway", num: 14}
3: {name: "tim", pts: 51, team: "kazos", city: "dragzon", num: 43}
length: 4
__proto__: Array(0)
因此,我在这里的目标是将
playerary
中正确的
num
添加到
dataArray
中,上面的示例成功地做到了这一点。但是,我的项目中实际的
dataArray
有~10000个对象,而实际的
playerary
有~2000个对象,我认为对长度为2000的对象执行10000个过滤器不是特别有效


只是好奇在我的React应用程序中是否有更好的方法?上面的操作似乎不是特别有效。

为了提高效率,您应该将
playerary
作为一个对象,这样您就不需要所有的
过滤器和
map
业务。然后,您可以在固定时间内查找它,而不是在播放器中搜索dataArray的每个元素:

var playerray=[
{id:'tom',编号:34,年龄:12},
{id:'joe',num:24,age:14},
{id:'bim',数字:14,年龄:15},
{id:'tim',num:43,age:16},
{id:'nik',数字:10,年龄:17},
{id:'jib',num:12,age:87}
];
//主阵列
变量数据数组=[
{姓名:'tom',分数:24,球队:'bozos',城市:'detroit'},
{姓名:'joe',分数:14,球队:'bozos',城市:'chicago'},
{名称:'bim',pts:34,团队:'kazos',城市:'milkway'},
{姓名:'tim',分数:51,球队:'kazos',城市:'dragzon'}
];
//将对象设置为键控id
让playerObject=playerArray.reduce((对象,项)=>{
obj[item.id]=项目
返回obj
}, {})
//现在,您可以使用名称查找id:
dataArray.forEach(item=>item.num=playerObject[item.name].num)

console.log(dataArray)
playerary
创建一个对象,这样您就不必每次都遍历它

var playerObject = {};
playerArray.forEach(player => {
  playerObject[player.id] = player.num;
});

dataArray.forEach(dataPlayer => {
  dataPlayer.num = playerObject[dataPlayer.name];
});

把自己当成我的英雄-谢谢你这么感谢