查找出现两次的值



我有这个对象:

[{
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()不会创建对象文字。此外,对象没有setget,因此不能混合对象和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)