将属性添加到另一个数组中的对象数组

时间:2018-02-22 16:04:44

标签: javascript

我有一个这样的数组,带有名称和地址:

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

3 个答案:

答案 0 :(得分:2)

您可以使用mapfind

使用map循环数组并创建一个新数组。

使用find检查字符串是否在数组中。

&#13;
&#13;
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;
&#13;
&#13;

请查看文档:{​​{3}},.map

答案 1 :(得分:2)

使用forEach代替for只会用forEach替换两个for循环。我们可以争论forforEach之间哪个最好,但我认为没有一个好的答案。在现代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)

你也可以这样做。

&#13;
&#13;
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;
&#13;
&#13;