检查数组的某些元素是否相等

时间:2018-08-12 20:10:10

标签: javascript arrays frontend

我只发现了一个问题“如果所有元素都相等”。这不适合我,我还需要另一件事:扫描数组并获取相等的元素,然后将其推入另一个数组。

样本输入:

arr = [1, 3, 3, 1]

样本输出:

group = [[1,1],[3,3]]

这是我的代码:

arr = [1, 3, 3, 1];
group = [];

pickNums = (a,b) => {
... ? group.push([a]) : null

arr.reduce(pickNums);

我不知道写什么,而不是“ ...”。你有什么想法吗?

4 个答案:

答案 0 :(得分:2)

您可以使用Map并将所有值分组在同一组中。

var array = [1, 3, 3, 1],
    groups = Array.from(
        array
            .reduce((m, v) => m.set(v, [...(m.get(v) || []), v]), new Map)
            .values()
    );
    
console.log(groups);

答案 1 :(得分:2)

使用Array.reduce()将项目收集到字典中,然后使用Object.values()转换回数组:

const arr = [1, 3, 3, 1];

pickNums = (arr) =>
  Object.values(arr.reduce((r, n) => {
    r[n] = r[n] || [];
  
    r[n].push(n);
  
    return r;
  }, {}));

const groups = pickNums(arr);

console.log(groups);

答案 2 :(得分:0)

这样的声音可以通过使用Object / Hash保留相似元素的计数器来最佳解决。

const array = [1, 3, 3, 1];
const elementCounterObject = {};
array.map(element => {
   if (!elementCounterObject[element]) {
       elementCounterObject[element] = 1;
   } else {
       elementCounterObject[element] += 1;
   }
});

console.log(elementCounterObject);   // result: {1: 2, 3: 2}

// converting elementCounterObject to display output as per requirement
const resultingArrayToDisplay = [];

for (let element in elementCounterObject) {
    const numberOfInstances = elementCounterObject[element];
    const elementToNumberOfInstanceArray = new Array(numberOfInstances).fill(parseInt(element));
    resultingArrayToDisplay.push(elementToNumberOfInstanceArray);
};

console.log(resultingArrayToDisplay); // result: [[1,1], [3,3]]

我将此代码段设置为冗长的,以便您可以了解其背后的算法。显然可以将一些绒毛刮掉以使其简洁,但是我希望这可以解决您的查询

答案 3 :(得分:0)

这就是您想要的:

Rep f