如何在循环中停止重复值?

时间:2017-05-31 10:37:28

标签: javascript arrays loops

我正在使用此代码使用键“category”读取每个对象的所有值:

const listChapter = datas.map((data) => console.log(data.category))

datas是一个Objects数组,有45个对象。

问题是,当我在console.log中,我有许多重复值时,你可以在下面看到:

console.log results

我希望每个类别都有一个唯一值。我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:1)

在迭代之前从数据中过滤重复项。

var unique = datas.reduce(function(unique, data) {
  return unique.indexOf(data.category) === -1 ? unique.concat(data.category) : unique;
}, []);

答案 1 :(得分:0)

这种方法更快,因为迭代次数更少:

const listChapter = Object.keys(datas.reduce((ac, el) => {
    ac[el.category] = true
    return ac
}, {}))

答案 2 :(得分:0)

arr是整个数组。

for(var i = 0; i < data.length; i++) {
            if(arr[i] == data.category) {
              remove item here;
            }
          }

答案 3 :(得分:0)

你也可以使用Set:

来解决这个问题
let data = ['Alfa', 'Alfa', 'Beta', 'Gamma', 'Beta', 'Omega', 'Psi', 'Beta', 'Omega'];

let arr = [... new Set(data)];
// Or   = Array.from(new Set(data));

console.log(arr);

编辑:我忘了你有对象数组。在那种情况下:

let data2 = [
  {'category': 'Alfa'},
  {'category': 'Alfa'},
  {'category': 'Beta'}
]    

let set = new Set();
data2.forEach((data) => {
  set.add(data.category);
});

let arr2 = [... set];

console.log(arr2);

答案 4 :(得分:0)

这是使用filter()的替代单线程(仅为了好玩):

console.log(datas.filter((data, i, a) =>
        i === a.findIndex(data2 => data.category === data2.category)));

答案 5 :(得分:0)

这是Tomek's答案的微小改进。 (我暂时无法发表评论。)

const arr = [
  {'category': 'Alfa'},
  {'category': 'Alfa'},
  {'category': 'Beta'}
]; 

const unique = [...new Set(arr.map(item => item.category))];