我有这个对象:
[{
id: 'foo',
name: 'apple',
type: 'fruit'
},
{
id: 'bar',
name: 'banana',
type: 'fruit'
},
{ id:'baz',
name: 'carrot',
type: 'vegetable'
}
];
我正试图弄清楚哪种类型已经发生了两次。例如,在这种情况下,水果会在这个物体中出现两次。
到目前为止,我已经设置了这个代码,但它只会导致值出现一次而不是两次,我不知道为什么。
尝试:
let map = new Map();
for(let i=0; i < obj.length; i++){
if(map.hasOwnProperty(obj[i].type))
{
map.set(obj[i].type, map.get(obj[i].type) +1);
}
else
{
map.set(obj[i].type, 1);
}
}
let keys = Object.keys(map).filter(k=>map[k] === 2);
其中obj是上面的对象。keys返回一个空数组,map只将上面的类型映射为1。
不知道为什么它没有正确计算发生的次数。
您需要使用正确的Map
方法
- 要获取密钥,需要使用
Map.prototype.keys
- 要检查是否存在,请使用
Map.protoype.has
let obj = [{id: 'foo',name: 'apple',type: 'fruit'},{id: 'bar',name: 'banana',type: 'fruit'},{id: 'baz',name: 'carrot',type: 'vegetable'}];
let map = new Map();
for (let i = 0; i < obj.length; i++) {
let key = obj[i].type
if (map.has(key)) {
map.set(key, map.get(key) + 1);
} else {
map.set(key, 1);
}
}
let keys = [...map.keys()].filter(k => map.get(k) === 2);
console.log(keys)
我认为@Code Maniac正确回答了您的问题。您使用hasOwnProperty
而不是Map.has
,使用map[k]
而不是`map.get(k(.
除此之外,代码返回Map {"fruit" => 1, "vegetable" => 1}
的原因是hasOwnProperty
不是Map
方法,而是Object
方法,用于检查该对象中是否存在具有键的属性。在您的情况下,由于您使用Map.set
添加到映射,因此它不会添加Object属性,这意味着if
条件总是返回false,从而使代码重写Map
中的值。
如果要使用hasOwnProperty
,则需要将map
更改为常规Object
,而不是Map
(我的意思是,您也可以将Map
用作常规Object
,但这只是因为JS非常灵活。不推荐(
let obj = [{id: 'foo',name: 'apple',type: 'fruit'},{id: 'bar',name: 'banana',type: 'fruit'},{id: 'baz',name: 'carrot',type: 'vegetable'}];
let map = {};
for (let i = 0; i < obj.length; i++) {
if (map.hasOwnProperty(obj[i].type)) {
map[obj[i].type] = map[obj[i].type] + 1;
} else {
map[obj[i].type] = 1;
}
}
let keys = Object.keys(map).filter(k=>map[k] === 2);
console.log(keys)
如果要将映射用作对象,则必须更改一些内容,因为new Map()
不会创建对象文字。此外,对象没有set
和get
,因此不能混合对象和Map
对象的匹配函数。请参见Objects_vs_映射
let obj = [{
id: "foo",
name: "apple",
type: "fruit",
},
{
id: "bar",
name: "banana",
type: "fruit",
},
{
id: "baz",
name: "carrot",
type: "vegetable"
},
];
let map = {};
for (let i = 0; i < obj.length; i++) {
if (map.hasOwnProperty(obj[i].type)) {
map[obj[i].type] = map[obj[i].type] + 1;
} else {
map[obj[i].type] = 1;
}
}
let keys = Object.keys(map).filter((k) => map[k] === 2);
console.log(keys)