我有一个包含不同衣服和布料类型的阵列。例如,我可能有一件属于衬衫类别的特定衬衫。我想要做的是从数组中获取所有类型并忽略任何重复的条目。所以,如果我有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不是函数。
答案 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 = [];
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;
答案 2 :(得分:1)
这是因为您将categories
定义为对象文字({}
),而不是数组([]
):
// --------------vv
var categories = {};
答案 3 :(得分:1)
您的问题是您尝试在对象上调用<table>
<th>
...
</th>
<tbody style="height: 50vh; overflow-y: scroll;
</tbody>
</table>
方法,但该方法仅在Array上可用。您需要将类别设为数组才能推送到它。
作为替代方案,您可以使用.push
使用纯函数而不使用任何突变来将重复对象的数组减少为唯一对象:
Array.prototype.reduce()
&#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);