为什么我得到 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);

  1. 无需为 属性 名称使用字符串文字。 i.name 足够了。

  2. 您检查的是“未定义”而不是 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) );