从数组中找到的唯一元素创建新数组
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))
我被分配了一项任务:
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))