如何基于共同值对数组进行分组?

问题描述 投票:2回答:3

我有如下数据结构:

a : { active: true, key: "first", page: 1 },
b : { active: true, key: "second", page: 1 },
c : { active: true, key: "third", page: 2 },
d : { active: true , key: "fourth", page: 2 },
e : { active: false , key: "fifth", page: 3 },

从这些数据,首先我需要找到活动状态为true的数据然后我需要创建一个包含具有相同页码的子数组的新数组。我需要这样的东西。

[
    ["first", "second"],
    ["third", "fourth"],
    ["fifth"]
]

我试过的是:

let myArray = Object.entries(dashboardKeyConfiguration).filter(x => x[1]["active"]);

var groups = [];
        for (var i = 0; i < myArray.length; i++) {
            var groupName = myArray[i][1]["page"];
            if (!groups[groupName]) {
                groups[groupName] = [];
            }
            groups[groupName].push(myArray[i][1]["key"]);
        }
        myArray = [];
        console.log(groups);

它插入空作为第一项如下:

(3) [empty, Array(2), Array(2)]
javascript
3个回答
1
投票

这是因为page1开始只是从1减去groupName

let obj = { a : { active: true, key: "first", page: 1 }, b : { active: true, key: "second", page: 1 }, c : { active: false, key: "third", page: 2 }, d : { active: false , key: "fourth", page: 2 }, e : { active: true , key: "fifth", page: 3 }} 


let myArray = Object.entries(obj).filter(x => x[1]["active"]);
var groups = [];
        for (var i = 0; i < myArray.length; i++) {
            var groupName = myArray[i][1]["page"]-1;
            if (!groups[groupName]) {
                groups[groupName] = [];
            }
            groups[groupName].push(myArray[i][1]["key"]);
        }
groups = groups.filter(x => x !== undefined)
console.log(groups)

2
投票

我们可以定义pageLength我们可以拥有的最大页数。然后我们可以从i循环到pageLength并在对象中搜索页面并将其推入临时数组中。一旦特定页面的循环完成,请在主array中推送临时array

const obj = {
        a : { active: true, key: "first", page: 1 },
        b : { active: true, key: "second", page: 1 },
        c : { active: true, key: "third", page: 2 },
        d : { active: true , key: "fourth", page: 2 },
        e : { active: false , key: "fifth", page: 3 },
        }
        let pageLength = 3;
        let array = [] ;
        
        for(let i = 1;i<=pageLength;i++){  
            temp = [];   
            for (var key in obj) {
                if (obj.hasOwnProperty(key)) {
                    let value = obj[key].key;
                    let page = obj[key].page;
                    if(page == i){    
                        temp.push(value);
                    } 
                }
            }
            array.push(temp) 
        }
        
        console.log(array)

这只是一个原始逻辑。请记住,此复杂性可能很高,您可以更好地完成此操作。


1
投票
Object.values(Object.keys(obj).reduce((acc,key)=>{
    if(obj[key].active) {if(acc[obj[key].page]) {acc[obj[key].page].push(obj[key].key)} else {acc[obj[key].page] = [obj[key].key]}}
        return acc
},{}))

我们可以减少对象的“活动键为真”的对象条目

Object.keys(obj).reduce((acc,key)=>{
     if(obj[key].active) {if(acc[obj[key].page]) {acc[obj[key].page].push(obj[key].key)} else {acc[obj[key].page] = [obj[key].key]}}
        return acc
},{})

output:
{
    1:["first","second"],
    3:["fifth"]
}

我们可以从这个对象中获取值

[["first","second"],["fifth"]]

有关更多信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

© www.soinside.com 2019 - 2024. All rights reserved.