如何解决从数组中找到的唯一元素创建新数组
我得到了一个任务:
在数组中查找唯一元素并从这些唯一元素创建一个新数组。
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() 和 Array.filter()
的直接方法唯一元素具有相同的第一个位置和最后一个位置
示例代码:
const initailArray = [...'ldfkjlqklnmbnmykdshgmkudqjshmjfhmsdjhmjh']
const uniqueLetters = initailArray.filter((c,i,a)=>a.indexOf(c)===a.lastIndexOf(c)).sort()
console.log(JSON.stringify(uniqueLetters))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。