我有一个这样的数组,带有名称和地址:
BTDevices = [
{name:"n1", address:"add1"},
{name:"n2", address:"add2"},
{name:"n3", address:"add3"}]
另一个带别名和地址的数组:
EqAlias = [
{btAlias:"a1", address:"add0"},
{btAlias:"a2", address:"add2"},
{btAlias:"a3", address:"add9"}]
我想将btAlias属性添加到BTDevices中的所有对象,并仅在地址相同时设置值,例如在这种情况下我想要以下结果:
BTDevices:
name:"n1", address:"add1", btAlias:""
name:"n2", address:"add2", btAlias:"a2"
name:"n3", address:"add3", btAlias:""
我的第一个解决方案是使用forEach添加btAlias属性,然后使用两个for循环:
// Add Alias
this.BTDevices.forEach(function(obj) { obj.btAlias = "" });
// Set Alias
for (let m = 0; m < this.EqAlias.length; m ++)
{
for (let n = 0; n < this.BTDevices.length; n++)
{
if (this.BTDevices[n].address == this.EqAlias[m].address)
this.BTDevices[n].btAlias = this.EqAlias[m].btAlias;
}
}
还有更好的方法吗?我想使用forEach
答案 0 :(得分:2)
您可以使用map
和find
使用map
循环数组并创建一个新数组。
使用find
检查字符串是否在数组中。
let BTDevices = [{name:"n1", address:"add1"},{name:"n2", address:"add2"},{name:"n3", address:"add3"}];
let EqAlias = [{btAlias:"a1", address:"add0"},{btAlias:"a2", address:"add2"},{btAlias:"a3", address:"add9"}];
let result = BTDevices.map( v => {
v.btAlias = ( EqAlias.find( e => e.address == v.address ) || { btAlias:"" } ).btAlias;
return v;
});
console.log( result );
&#13;
请查看文档:{{3}},.map
答案 1 :(得分:2)
使用forEach
代替for
只会用forEach
替换两个for循环。我们可以争论for
和forEach
之间哪个最好,但我认为没有一个好的答案。在现代JavaScript中,您还可以使用for of
循环。
您的算法是最简单的,它可以工作。
但是,如果你想解决一些性能问题,你应该知道你的算法也是最慢的(O(n²)复杂度)
另一种方法是在地图中存储BTDevices
项,以便更快地找到它们。例如:
let map = new Map();
BTDevices.forEach(e => map.set(e.address, e));
EqAlias.forEach(e => {
let device = map.get(e.address);
if (device) {
device.btAlias = e.btAlias;
}
});
此代码的唯一优势是在Map中查找项目更快(在O(1)和O(n)之间,它取决于Map
实现)。但除非你试图操纵一些非常大的数组,否则你不会看到任何差异。
答案 2 :(得分:1)
你也可以这样做。
var BTDevices = [{name:"n1", address:"add1"},{name:"n2", address:"add2"},{name:"n3", address:"add3"}];
var EqAlias = [{btAlias:"a1", address:"add0"},{btAlias:"a2", address:"add2"},{btAlias:"a3", address:"add9"}];
var EqAliasAdd = EqAlias.map((e)=>e.address);
var BTDevicesAdd = BTDevices.map((e)=>e.address);
BTDevicesAdd.map(function(i,k) {
BTDevices[k].btAlias = "";
if(EqAliasAdd.indexOf(i) >= 0)
BTDevices[k].btAlias = EqAlias[k].btAlias;
});
console.log(BTDevices);
&#13;