我需要编写一个JS函数,该函数从给定的字符串创建对象。字符串字符是对象键。重复的字符不应包含两次。所有键的值为零。

示例:输入objFromStr("aaabc")应该返回{a: 0, b: 0, c: 0}
这是我的解决方案:

function objFromStr(inStr) {
  let charsArr = inStr.split("");

  let charsObj = {};
  var alreadyInArr = [];

  for (var i = 0; i < charsArr.length; i++) {
    if (!(alreadyInArr.includes(charsArr[i]))) {
      charsObj[charsArr[i]] = 0;
    } else {
      alreadyInArr.push(charsArr[i]);
    }
  }

  return charsObj;
}

该解决方案按预期工作,但是我不明白为什么。
我使用alreadyInArr检查字符重复。但是,当我记录我的alreadyInArr时,它是空的。

因此,运行此代码后:
function objFromStr(inStr) {
  let charsArr = inStr.split("");

  console.log("charsArr is:", charsArr);

  let charsObj = {};
  var alreadyInArr = [];

  for (var i = 0; i < charsArr.length; i++) {
    if (!(alreadyInArr.includes(charsArr[i]))) {
      charsObj[charsArr[i]] = 0;
    } else {
      alreadyInArr.push(charsArr[i]);
    }
  }

  console.log("alreadyInArr is:", alreadyInArr);

  return charsObj;
}

console.log(objFromStr("aaabc"));

我的输出是:
charsArr is: [ 'a', 'a', 'a', 'b', 'c' ]
alreadyInArr is: []
{ a: 0, b: 0, c: 0 }

有人可以解释为什么alreadyInArr为空而功能仍然按预期工作吗?

这是一支笔:https://codepen.io/t411tocreate/pen/bYReRj?editors=0012

最佳答案

您的else子句根本无法到达,因为您没有将元素推入正确的位置,您可以在循环内添加console.log()来查看数组在所有迭代中仍然为空。

相反,应在if条件中将元素推送到,例如:

for (var i = 0; i < charsArr.length; i++) {
    if (!alreadyInArr.includes(charsArr[i])) {
        charsObj[charsArr[i]] = 0;
        alreadyInArr.push(charsArr[i]);
    }
}

希望这可以帮助。

function objFromStr(inStr) {
  let charsArr = inStr.split("");

  console.log("charsArr is:", charsArr);

  let charsObj = {};
  var alreadyInArr = [];

  for (var i = 0; i < charsArr.length; i++) {
    if (!alreadyInArr.includes(charsArr[i])) {
      charsObj[charsArr[i]] = 0;
      alreadyInArr.push(charsArr[i]);
    }
  }

  console.log("alreadyInArr is:", alreadyInArr);

  return charsObj;
}

console.log(objFromStr("aaabc"));

07-24 19:56