如何检查一个数组是否只包含一个不同的元素?

8

如何检查数组是否仅包含一个唯一元素?

var arr = [1, 1, 1];
var arr2 = [1, 2, 3];
checkIfThereIsOnlyOneElement(arr); //should return true
checkIfThereIsOnlyOneElement(arr2) //should return false;`

1
使用Array.length - Saravana
1
循环遍历数组,从第二次迭代开始循环(即从1开始而不是0),将元素与前一个元素进行比较。如果比较结果不相等,则返回false。循环结束后,返回true。 - David
1
@Saravana那会如何帮助我? - stephenpassero
1
@PHPGeek 如果这是一个 PHP 的问题,那就太好了... - castis
@stephenpassero,所以您想要计算唯一值。我没有从您的问题中得到这个意思。我的错。 - Saravana
显示剩余4条评论
8个回答

6
使用 Set 对象:

var arr = [1, 1, 1],
    arr2 = [1, 2, 3],
    checkForOne = function(arr){
        return (new Set(arr)).size === 1;
    }
    
console.log(checkForOne(arr));
console.log(checkForOne(arr2));


Array.length 不够吗?为什么要把问题复杂化呢? - kind user
@Kinduser:Array.length怎么可能就够了呢? - David
@Kinduser,这个问题在我看来是关于“一个独特的元素”。这就是为什么OP想要对[1, 1, 1]返回true的原因。 - RomanPerekhrest
@David Fine,如果OP只是在寻找独特的元素,那么这就是正确的方法。 - kind user

3
您可以这样实现:

var arr = [1, 1, 1];
var arr2 = [1, 2, 3];

console.log(checkIfThereIsOnlyOneElement(arr));
console.log(checkIfThereIsOnlyOneElement(arr2));

function checkIfThereIsOnlyOneElement(arr) {
    arr.sort();
    return arr[0] == arr[arr.length -1]
}


非常好。对数组进行排序,然后检查第一个和最后一个项目是否相同。其他答案会使事情变得复杂。 - castis
1
@castis 如果数组有一千个元素怎么办?我猜排序函数会过度杀伤。在我看来,“Set”方法似乎更好。 - kind user
好的,OP提供了一个长度为3的示例。没有必要为此过度设计。如果OP有巨大的性能问题,我想他们会回来的。 - castis

0

你可以检查数组中的唯一值。基于此术语,我们可以实现您的函数:

var arr = [1, 1, 1];
var arr2 = [1, 2, 3];

function checkIfThereIsOnlyOneElement(arr) {
    return arr.filter(function (item, i, ar) {
            return ar.indexOf(item) === i;
        }).length === 1;
}

console.log(checkIfThereIsOnlyOneElement(arr));
console.log(checkIfThereIsOnlyOneElement(arr2));

jsfiddle


0
你可以使用 Array#every 并且只检查第一个元素。

function checkDistinct(array) {
    return array.every(function (a, _, aa) { return a === aa[0]; });
}

var arr = [1, 1, 1],
    arr2 = [1, 2, 3];

console.log(checkDistinct(arr));  // true
console.log(checkDistinct(arr2)); // false


0

你可以像 @Nina Scholz 指出的那样使用 .every() 来正确执行,但是为了多样性,你也可以这样做:

var all = a => a.length-1 ? a[0] === a[1] && all(a.slice(1)) : true;
console.log(all([1,1,1,1]));
console.log(all([1,1,1,2]));

一旦遇到 false 值,停止迭代具有相同的好处。


0

尝试这个简单的实现

function checkIfThereIsOnlyOneElement(arr)
{
  var map = {};//create a map
  for( var counter = 0; counter < arr.length; counter++)
  {
    map[ arr[ counter ] ] = true;
    if ( Object.keys ( map ).length > 1 ) //check if this map has only one key
    {
      return false;
    }
  }
  return true;
}

@Kinduser 它正在检查数组中是否只有一个唯一元素。 - gurvinder372
@Kinduser 没有理解您的意思。 "它正在引爆开着的门" 是什么意思? - gurvinder372
我知道,我的意思是要问 - 我是以什么方式这样做的。 - gurvinder372

0

简单地检查所有元素是否包含相同的值,一种方法是使用“lodash”模块的“uniq”函数:

checkIfThereIsOnlyOneElement(arr){
     return _.uniq(arr).length == 1; 
}

0

这个函数有很多相当简单的实现方式。让我给你两个例子,一个是功能性的一行代码,另一个是迭代式(可能更高效)的片段。

顺便说一下,你的命名非常糟糕,应该叫做:isArrayOfTheSameElements

  // Iterative:
  function isArrayOfTheSameElements(arr){
    var firstElement = arr[0];
    for(var i=1; i < arr.length; i++){
      if (arr[i]!==firstElement) {
        return false;
      }
    }
    return true;
  }

  // Functional:
  function isArrayOfTheSameElements(arr){
    return Object.keys(arr.reduce(function(current, next){
      return current[next] = next && current;
    }, {})).length <= 1;
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接