使用angular 4删除对象数组中的重复项

时间:2019-01-08 19:06:57

标签: javascript arrays

我有一个数组,其中的项如下图所示,我想删除重复项
[L7-LO, %L7-LO]来自该数组。

Array with repetitions
我已经尝试过以下条件:

场景1:

this.formulalist.filter((el, i, a) => i == a.indexOf(el))

方案2:

Observable.merge(this.formulalist).distinct((x) => x.Value)
          .subscribe(y => {
       this.formulalist.push(y)
   });

方案3:

this.formulalist.forEach((item, index) => {
        if (index !== this.formulalist.findIndex(i => i.Value == item.Value)) 
        {
            this.formulalist.splice(index, 1);
        }

    });

以上三种情况均无法从该阵列中删除重复项。有人可以帮忙这个查询吗?

7 个答案:

答案 0 :(得分:1)

没有必要使用vanillajs 过滤仅出现一次的元素,并将第一次出现的内容添加到新列表中

let newFormulalist =  formulalist.filter((v,i) => formulalist.findIndex(item => item.value == v.value) === i);

答案 1 :(得分:1)

const result = Array.from(this.item.reduce((m, t) => m.set(t.name, t), new Map()).values());

希望这行得通!

答案 2 :(得分:1)

// user reduce method to remove duplicates from object array , very easily

  this.formulalist= this.formulalist.reduce((a, b) => {
      if (!a.find(data => data.name === b.name)) {
        a.push(b);
      }
      return a;
    }, []);

// o/p = in formulalist you will find only unique values

答案 3 :(得分:0)

尝试填充没有重复项的新数组。稍后将新数组分配给Formulalist。

newArr = []
this.formulalist.forEach((item, index) => {
    if (this.newArr.findIndex(i => i.Value == item.Value) === -1) 
    {
        this.newArr.push(item)
    }

});
this.formulalist = this.newArr

答案 4 :(得分:0)

使用reducer返回唯一对象的新数组:

const input = [{
    value: 'L7-LO',
    name: 'L7-LO'
  },
  {
    value: '%L7-LO',
    name: '%L7-LO'
  },
  {
    value: 'L7-LO',
    name: 'L7-LO'
  },
  {
    value: '%L7-LO',
    name: '%L7-LO'
  },
  {
    value: 'L7-L3',
    name: 'L7-L3'
  },
  {
    value: '%L7-L3',
    name: '%L7-L3'
  },
  {
    value: 'LO-L3',
    name: 'LO-L3'
  },
  {
    value: '%LO-L3',
    name: '%LO-L3'
  }
];
console.log(input.reduce((acc, val) => {
  if (!acc.find(el => el.value === val.value)) {
    acc.push(val);
  }
  return acc;
}, []));

答案 5 :(得分:0)

通过将值分配给某些对象属性可以更快地过滤唯一值-不会重复。 对于初始数组的每个+1成员,这种方法越来越好,因为循环会导致算法快速复杂化

let arr = [
  {value: 'L7-LO', name: 'L7-LO'},
  {value: '%L7-LO', name: '%L7-LO'},
  {value: 'L7-LO', name: 'L7-LO'},
  {value: '%L7-LO', name: '%L7-LO'},
  {value: 'L7-L3', name: 'L7-L3'},
  {value: '%L7-L3', name: '%L7-L3'},
  {value: 'LO-L3', name: 'LO-L3'},
  {value: '%LO-L3', name: '%LO-L3'}
];
let obj = {};

const unique = () => {
  let result = [];
  
  arr.forEach((item, i) => {
    obj[item['value']] = i;
  });
  
  for (let key in obj) {
    let index = obj[key];
    result.push(arr[index])
  }
  
  return result;
}

arr = unique(); // for example; 

console.log(arr);

答案 6 :(得分:0)

如果您使用的是ES6及更高版本,则使用地图和过滤器功能的基本JS会很容易。

ptrace