繁体   English   中英

使用 Array.length 属性而不是 function 通过仅计算不同元素而不是所有元素来返回数组的长度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM