使用 Array.length 属性 而不是 return 数组长度的函数,只计算不同的元素而不是所有元素
Use Array.length property and not a function to return length of an array by counting only distinct elements and not all elements
所以我有一个这样的数组:
项目 = [2, 2, 5, 3, 5, 3, 4, 7, 2, 7];
有没有办法在这里使用 items.length 属性 到 return 5 而不是 10。我看到了一种方法,其中使用函数来获取不同的计数通过将长度 属性 作为参数传递给元素。我想要实现的目标略有不同。我希望通过调用 Array.length 属性 而不是通过函数来打印长度。有可能吗?
函数如下:
function countDistinct(arr, n) {
let res = 1;
// Pick all elements one by one
for (let i = 1; i < n; i++) {
let j = 0;
for (j = 0; j < i; j++)
if (arr[i] === arr[j])
break;
// If not printed earlier, then print it
if (i === j)
res++;
}
return res;
}
// Driver program to test above function
let arr = [2, 2, 5, 3, 5, 3, 4, 7, 2, 7];
let n = arr.length;
console.log((countDistinct(arr, n)));
这几乎不可能,但确实很奇怪。如果创建另一个包装数组的对象,则可以使 length
属性 成为删除重复项目的 getter 和 returns 大小,类似于:
const makeSpecialArr = (arr) => {
const specialArr = Object.create(arr);
Object.defineProperty(specialArr, 'length', {
get() {
return new Set(arr).size;
},
});
return specialArr;
};
const arr = makeSpecialArr([2, 2, 5, 3, 5, 3, 4, 7, 2, 7]);
console.log(arr.length);
如果不在数组周围创建另一个对象就无法执行此操作,因为数组的 .length
是一个自身不可配置的 属性.
如果您想做这样的事情,请考虑使用 属性 其他 而不是 length
,这样会容易得多:
const makeSpecialArr = (arr) => {
Object.defineProperty(arr, 'dedupLength', { get() {
return new Set(arr).size;
}});
return arr;
};
const arr = makeSpecialArr([2, 2, 5, 3, 5, 3, 4, 7, 2, 7]);
console.log(arr.dedupLength);
但即使这样也很奇怪。作为理论代码或思想实验可能很有趣,但我不会将它用于任何必须维护的严肃内容。
您可以为此使用 reduce:
var count = arr.reduce(function(values, v) {
if (!values.set[v]) {
values.set[v] = 1;
values.count++;
}
return values;
}, { set: {}, count: 0 }).count;
所以我有一个这样的数组:
项目 = [2, 2, 5, 3, 5, 3, 4, 7, 2, 7];
有没有办法在这里使用 items.length 属性 到 return 5 而不是 10。我看到了一种方法,其中使用函数来获取不同的计数通过将长度 属性 作为参数传递给元素。我想要实现的目标略有不同。我希望通过调用 Array.length 属性 而不是通过函数来打印长度。有可能吗?
函数如下:
function countDistinct(arr, n) {
let res = 1;
// Pick all elements one by one
for (let i = 1; i < n; i++) {
let j = 0;
for (j = 0; j < i; j++)
if (arr[i] === arr[j])
break;
// If not printed earlier, then print it
if (i === j)
res++;
}
return res;
}
// Driver program to test above function
let arr = [2, 2, 5, 3, 5, 3, 4, 7, 2, 7];
let n = arr.length;
console.log((countDistinct(arr, n)));
这几乎不可能,但确实很奇怪。如果创建另一个包装数组的对象,则可以使 length
属性 成为删除重复项目的 getter 和 returns 大小,类似于:
const makeSpecialArr = (arr) => {
const specialArr = Object.create(arr);
Object.defineProperty(specialArr, 'length', {
get() {
return new Set(arr).size;
},
});
return specialArr;
};
const arr = makeSpecialArr([2, 2, 5, 3, 5, 3, 4, 7, 2, 7]);
console.log(arr.length);
如果不在数组周围创建另一个对象就无法执行此操作,因为数组的 .length
是一个自身不可配置的 属性.
如果您想做这样的事情,请考虑使用 属性 其他 而不是 length
,这样会容易得多:
const makeSpecialArr = (arr) => {
Object.defineProperty(arr, 'dedupLength', { get() {
return new Set(arr).size;
}});
return arr;
};
const arr = makeSpecialArr([2, 2, 5, 3, 5, 3, 4, 7, 2, 7]);
console.log(arr.dedupLength);
但即使这样也很奇怪。作为理论代码或思想实验可能很有趣,但我不会将它用于任何必须维护的严肃内容。
您可以为此使用 reduce:
var count = arr.reduce(function(values, v) {
if (!values.set[v]) {
values.set[v] = 1;
values.count++;
}
return values;
}, { set: {}, count: 0 }).count;