如何在javascript中重新分组数组?

How to re-group an array in javascript?

提问人:gadss 提问时间:11/13/2023 最后编辑:The Alphagadss 更新时间:11/13/2023 访问量:84

问:

我的javascript中有这组数组。

var array = [
['Jack', 'A'], 
['Jack', 'A'], 
['Sara', 'A'], 
['Jack', 'B'], 
['Peter', 'B'],
['Sara', 'C'], 
['Sara', 'B'],
['Sara', 'A'],
['Sara', 'B'], 
['Peter', 'B'],
['Peter', 'A'],
['Peter', 'C']
];

我的目标是像这样排列成一个数组。

Jack: A : 2
Jack: B : 1
Sara: A : 2
Sara: B : 2
Sara: C : 1
Peter: A : 1
Peter: B : 2
Peter: C : 1

我正在尝试像这样编码它,但我无法正确处理

let counts = {};
array.forEach(element => {
     counts[element] = (counts[element] || 0) + 1;
});

有人对此有想法吗? 谢谢。。

JavaScript 数组 排序

评论

2赞 Unmitigated 11/13/2023
预期结果是一个数组吗?请明确说明。

答:

1赞 The Alpha 11/13/2023 #1

我想你想要这样的东西:

let array = [
        ['Jack', 'A'], 
        ['Jack', 'A'], 
        ['Sara', 'A'], 
        ['Jack', 'B'], 
        ['Peter', 'B'],
        ['Sara', 'C'], 
        ['Sara', 'B'],
        ['Sara', 'A'],
        ['Sara', 'B'], 
        ['Peter', 'B'],
        ['Peter', 'A'],
        ['Peter', 'C']
    ];

    function transformArray(arr)
    {
        let result = {};

        arr.forEach(function(item) {

            let name = item[0];

            let category = item[1];
    
            if (!result[name]) {
                result[name] = {};
            }
    
            if (!result[name][category]) {
                result[name][category] = 1;
            } else {
                result[name][category]++;
            }
        });
    
        return result;
    }

    console.log(transformArray(array));

1赞 Nina Scholz 11/13/2023 #2

您可以按这两个值进行分组并映射计数。

const
    data = [['Jack', 'A'], ['Jack', 'A'], ['Sara', 'A'], ['Jack', 'B'], ['Peter', 'B'], ['Sara', 'C'], ['Sara', 'B'], ['Sara', 'A'], ['Sara', 'B'], ['Peter', 'B'], ['Peter', 'A'], ['Peter', 'C']],
    result = Object
        .values(Object.groupBy(data, a => a.join('|')))
        .map(a => [...a[0], a.length]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0赞 dreamer 12/4/2023 #3

要实现数组之间的等价性并计算每个等价类的出现次数,可以使用 @ut8pia/分类器库。value-based

只需将您的数据添加到:Classifier

import { Classifier } from "@ut8pia/classifier/queue/Classifier.js";

const 
    classifier = new Classifier()
        .letAll(data);

assert.equal(classifier.n(['Jack', 'A']), 2)

该方法计算每个项的出现次数。 此外,您的数据本质上是排序的(请参阅在线文档以获取说明)。n(item)

该库超越了对象之间的传统等价性。它适应和等效,在其框架内提供更广泛的功能。例如,虽然枚举每个等价类在等价方案中可能不是特别有用,但它在等价中变得至关重要。value-basedcomparator-basedrepresentation-basedvalue-basedrepresentation-based