在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];
});
把自己当成我的英雄-谢谢你这么感谢