JavaScript从数组中获取值但忽略重复项

时间:2016-06-16 10:09:04

标签: javascript arrays

我有一个包含不同衣服和布料类型的阵列。例如,我可能有一件属于衬衫类别的特定衬衫。我想要做的是从数组中获取所有类型并忽略任何重复的条目。所以,如果我有3件衬衫和2条裤子,我只能买1件衬衫和1条裤子。

array = [
    {
        name: "test 1",
        type: "shirt"
    },
  {
        name: "test 2",
        type: "shirt"
    },
  {
        name: "test 3",
        type: "trousers"
    },
  {
        name: "test 4",
        type: "trousers"
    }
];

var categories = {};
for(var i = 0, len = array.length; i < len; i++) {
    if(categories.indexOf(array[i].type) > -1) {
    console.log('Duplicate type');
  }
  else {
    console.log('New type');
    categories.push(array[i].type);
  }
}

但我最终得到TypeError:categories.indexOf不是函数。

5 个答案:

答案 0 :(得分:4)

使用ES6 Set对象的简短解决方案:

  

设置对象可让您存储任何类型的唯一值,无论是否   原始值或对象引用。

var categories = new Set();
array.forEach((o) => categories.add(o.type));
categories = [...categories];  // Set to Array transformation

console.log(categories);  // ["shirt", "trousers"]

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

答案 1 :(得分:3)

您需要一个类别数组,而不是对象。

var categories = [];

&#13;
&#13;
array = [
    {
        name: "test 1",
        type: "shirt"
    },
  {
        name: "test 2",
        type: "shirt"
    },
  {
        name: "test 3",
        type: "trousers"
    },
  {
        name: "test 4",
        type: "trousers"
    }
];

var categories = [];
for(var i = 0, len = array.length; i < len; i++) {
    if(categories.indexOf(array[i].type) > -1) {
    console.log('Duplicate type');
  }
  else {
    console.log('New type');
    categories.push(array[i].type);
  }
}
console.log(categories);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

这是因为您将categories定义为对象文字({}),而不是数组([]):

// --------------vv
var categories = {};

答案 3 :(得分:1)

您的问题是您尝试在对象上调用<table> <th> ... </th> <tbody style="height: 50vh; overflow-y: scroll; </tbody> </table> 方法,但该方法仅在Array上可用。您需要将类别设为数组才能推送到它。

作为替代方案,您可以使用.push使用纯函数而不使用任何突变来将重复对象的数组减少为唯一对象:

&#13;
&#13;
Array.prototype.reduce()
&#13;
&#13;
&#13;

答案 4 :(得分:0)

如果你想看到每一行的结果,那么我认为首先实现可能是答案,但如果你只想categories,那么使用map就可以了。

array = [
	{ name: "test 1", type: "shirt" }, 
	{ name: "test 2", type: "shirt" }, 
	{ name: "test 3", type: "trousers" }, 
	{ name: "test 4", type: "trousers" }
];

// --------------------------------------
var categories = [];
array.forEach(v => {
	if (this[v.type])
		return console.log('Duplicate type');
	console.log('New type');
	this[v.type] = true;
	categories.push(v.type);
}, {});

console.log(categories);
// --------------------------------------
var map = new Map;
array.forEach(v => map.set(v.type, v.type));
categories = [...map.keys()];

console.log(categories);