从数组中找到的唯一元素创建新数组

Creating new array from unique elements found in array

我被分配了一项任务:

Finding unique elements in an array and creating a new array from these unique elements.

The professor gave us the pseudocode to code this assignment - 应该很简单,但我的代码不起作用。

这是我的尝试:

// search for unique birthdays in the array
function find(birthdays) {
  var uniqueBirthdays = [];
  for (var i = 1; i <= birthdays.length; i = i + 2) {
    var count = 0;
    for (var j = 1; j <= birthdays.length; j = j + 2) {
      if (birthdays[i] == birthdays[j]) {
        count++;
      }
    }
    if (count == 1) {
      var n = uniqueBirthdays.length;
      uniqueBirthdays[n] = birthdays[i - 1];
    }
  }
  return uniqueBirthdays;
}

我已经尝试检查缩进错误以及其他一些事情,但无法弄清楚为什么在遍历数组时它给每个元素的计数仅为 1(意味着没有匹配的元素)-它似乎不会多次遍历数组,因此没有元素的计数大于 1 - 即使我使用的是嵌套 for 循环。

我将间隔增加了 2,因为我需要比较所有其他元素 - 每个生日都分配了一个数字,因此数组可能如下所示:

['0001'][12/15]['0002'[03/12]...

我是全新的,所以我可能忽略了简单但我尝试了很多东西,我不明白为什么这段代码不起作用 - 它返回分配给生日的所有元素,而不仅仅是独一无二的。

非常感谢能为我指明正确方向的任何帮助。

你们非常接近,只有几个错误。唯一不起作用的是您编写 for 循环的方式:

for (var i = 1; i <= birthdays.length; i = i + 2) {
  • 数组索引从0开始,所以如果你想处理第一个元素,使用var i = 0;
  • 由于这些索引从 0 开始,对于 3 个元素的数组,最后一个索引是 2。所以你只想运行你的循环,而i比数组长度i < birthdays.length
  • 您在执行 i = i + 2 时跳过了元素。好像没有什么理由?

还有一点值得一提:在 JS 中,缩进并不重要 - 好吧,它确实重要,但只是为了避免让你的眼睛流血。事实上,大多数网站都使用他们代码的缩小版本,适合单个 (通常很长很丑) 行 (example).

这是你的代码,只修改了两行:

function find(birthdays) {
  var uniqueBirthdays = [];
  for (var i = 0; i < birthdays.length; i = i + 1) { // <-----
    var count = 0;
    for (var j = 0; j < birthdays.length; j = j + 1) { // <-----
      if (birthdays[i] == birthdays[j]) {
        count++;
      }
    }
    if (count == 1) {
      var n = uniqueBirthdays.length;
      uniqueBirthdays[n] = birthdays[i];
    }
  }
  return uniqueBirthdays;
}
// I used letters instead of birthdays for easier demo checking
var birthdays = ['a', 'b', 'a', 'c'];
console.log( find(birthdays) ); // ["b", "c"]

JS 有使用 Array.indexOf(), Array.lastIndexOf() and Array.filter()

的直接方法

uniques 元素具有相同的第一个位置和最后一个位置

示例代码:

const initailArray = [...'ldfkjlqklnmbnmykdshgmkudqjshmjfhmsdjhmjh']

const uniqueLetters = initailArray.filter((c,i,a)=>a.indexOf(c)===a.lastIndexOf(c)).sort()

 
console.log(JSON.stringify(uniqueLetters))