为什么我得到 NaN 以及如何获得预期的输出?
Why am I getting NaN and How do I get the expected output?
我是 JS 新手。我想跟踪另一个对象中数组中重复对象的数量,所以我决定编写一个函数。例如:考虑以下对象。
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
我想跟踪上面数组中重复对象的数量,所以我写了下面的函数。
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== "undefined"
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
我得到的输出是:
{orange: NaN, apple: NaN, banana: NaN}
(预期输出) 我想要的输出是:
{orange: 2, apple: 1, banana: 1}
如何获得预期的输出?我做错了什么?
您的错误是针对 "undefined"
(单词)而不是 undefined
(未定义的值)进行测试:
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[i.name] !== undefined
? (duplicates[i.name] += 1)
: (duplicates[i.name] = 1);
}
return duplicates;
}
console.log( calcDuplicates(fruits) );
在条件中使用原始值 undefined
而不是字符串 "undefined"
:
duplicates[`${i.name}`] !== undefined
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== undefined
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
console.log(calcDuplicates(fruits))
这是因为你的条件应该针对 undefined
进行测试,而不是包含 'undefined'
.
的字符串
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== undefined
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
console.log( calcDuplicates(fruits) );
我会这样写:
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[i.name] = (duplicates[i.name] || 0) + 1
}
return duplicates;
}
console.log( calcDuplicates(fruits) );
几乎相同的事情,使用 reduce
和解构 map
:
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
const calcDuplicates = o => o
.map(({ name }) => name)
.reduce((a, b) => ({ ...a, [b]: (a[b] || 0) + 1 }), {})
console.log( calcDuplicates(fruits) );
这可以通过 reduce
和对象解构来实现,如下所示:
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
const duplicates = fruits.reduce( (acc,{name}) => {
if (!acc[name]) acc[name] = 0 ;
acc[name]++;
return acc;
},{});
console.log(duplicates);
无需为 属性 名称使用字符串文字。 i.name
足够了。
您检查的是“未定义”而不是 undefined
。但是,真的,没有必要那样做。只需检查对象 属性.
是否存在
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[i.name]
? duplicates[i.name] += 1
: duplicates[i.name] = 1;
}
return duplicates;
}
console.log(calcDuplicates(fruits));
只需从未定义中删除双引号 "
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== undefined
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
console.log( calcDuplicates(fruits) );
我是 JS 新手。我想跟踪另一个对象中数组中重复对象的数量,所以我决定编写一个函数。例如:考虑以下对象。
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
我想跟踪上面数组中重复对象的数量,所以我写了下面的函数。
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== "undefined"
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
我得到的输出是:
{orange: NaN, apple: NaN, banana: NaN}
(预期输出) 我想要的输出是:
{orange: 2, apple: 1, banana: 1}
如何获得预期的输出?我做错了什么?
您的错误是针对 "undefined"
(单词)而不是 undefined
(未定义的值)进行测试:
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[i.name] !== undefined
? (duplicates[i.name] += 1)
: (duplicates[i.name] = 1);
}
return duplicates;
}
console.log( calcDuplicates(fruits) );
在条件中使用原始值 undefined
而不是字符串 "undefined"
:
duplicates[`${i.name}`] !== undefined
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== undefined
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
console.log(calcDuplicates(fruits))
这是因为你的条件应该针对 undefined
进行测试,而不是包含 'undefined'
.
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== undefined
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
console.log( calcDuplicates(fruits) );
我会这样写:
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[i.name] = (duplicates[i.name] || 0) + 1
}
return duplicates;
}
console.log( calcDuplicates(fruits) );
几乎相同的事情,使用 reduce
和解构 map
:
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
const calcDuplicates = o => o
.map(({ name }) => name)
.reduce((a, b) => ({ ...a, [b]: (a[b] || 0) + 1 }), {})
console.log( calcDuplicates(fruits) );
这可以通过 reduce
和对象解构来实现,如下所示:
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
const duplicates = fruits.reduce( (acc,{name}) => {
if (!acc[name]) acc[name] = 0 ;
acc[name]++;
return acc;
},{});
console.log(duplicates);
无需为 属性 名称使用字符串文字。
i.name
足够了。您检查的是“未定义”而不是
是否存在undefined
。但是,真的,没有必要那样做。只需检查对象 属性.
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[i.name]
? duplicates[i.name] += 1
: duplicates[i.name] = 1;
}
return duplicates;
}
console.log(calcDuplicates(fruits));
只需从未定义中删除双引号 "
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== undefined
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
console.log( calcDuplicates(fruits) );