[英]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 属性来返回 5 而不是 10。我见过一种方法,其中使用 function 通过将长度属性作为参数传递来获取不同元素的计数。 我想要实现的略有不同。 我希望通过调用 Array.length 属性而不是通过 function 来打印长度。 有可能吗?
这是 function:
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)));
这几乎是不可能的,但这真的很奇怪。 如果您创建另一个包装数组的 object,您可以将length
属性设置为一个 getter,用于删除项目并返回大小,类似于:
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);
如果不在数组周围创建另一个 object 就无法做到这一点,因为数组的.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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.