使用 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;