Итериране и изброяване на двойки ключови стойности на множество масиви в обект

Въпросът ми е във връзка със следната функция:

function loadConfigurations(configs){
  console.log(configs);
}

Обектът 'configs', който получава функцията loadConfigurations, съдържа две свойства -- два масива, единият наречен "присвоен", другият наречен "неприсвоен". И изпълнението на console.log(configs) извежда следното:

"Object{assigned: Array[5], unassigned: Array[1]}"

Сега искам да изброя двойките ключ-стойност на всяко свойство както в „присвоения“ масив, така и в „неприсвоения масив“.

Обектът configs е структуриран по следния начин:

Съжалявам момчета. Това е структурата на configs обектите:

var configs = {
"config1":
        {
        "assigned": [
            {
                "name": "Admin Usersss",
                "value": "admin-user"
            },
            {
                "name": "MPR User",
                "value": "mpr-user"
            },
            {
                "name": "SAMHSA User",
                "value": "samhsa-user"
            }
         ],
        "unassigned": [
            {
                "name": "States User",
                "value": "states-user"
            },
            {
                "name": "All States User",
                "value": "all-states-user"
            },
            {
                "name": "Substance Abuse User",
                "value": "substance-abuse-user"
            }
         ]
        },
"config2":
        {
        "assigned": [
            {
                "name": "Admin User",
                "value": "admin-user"
            },
            {
                "name": "MPR User",
                "value": "mpr-user"
            },
            {
                "name": "SAMHSA User",
                "value": "samhsa-user"
            },
            {
                "name": "States User",
                "value": "states-user"
            },
            {
                "name": "All States User",
                "value": "all-states-user"
            }
        ],
        "unassigned": [
            {
                "name": "Substance Abuse User",
                "value": "substance-abuse-user"
            }
        ]
    },
    "config3":
    {
        "assigned": [
            {
                "name": "Admin User",
                "value": "admin-user"
            }
        ],
        "unassigned": [
            {
                "name": "States User",
                "value": "states-user"
            },
            {
                "name": "All States User",
                "value": "all-states-user"
            },
            {
                "name": "Substance Abuse User",
                "value": "substance-abuse-user"
            },
            {
                "name": "MPR User",
                "value": "mpr-user"
            },
            {
                "name": "SAMHSA User",
                "value": "samhsa-user"
            }
            ]
        }

Как да направя това?

Благодаря, CM


person Chris Mazzochi    schedule 30.09.2016    source източник
comment
Първо имайте предвид, че имате два масива, а не двойки ключ/стойност. За да постигнете това, от което се нуждаете, можете да използвате два цикъла, един над configs.assigned и друг над configs.unassigned.   -  person Rory McCrossan    schedule 30.09.2016
comment
Масивите всъщност нямат двойки ключ-стойност, а само индекси със съдържание, но може би configs.assigned.concat(configs.unassigned).forEach( (index, value) => ...   -  person adeneo    schedule 30.09.2016
comment
In each array there are key value pairs I want to get at. Това не може да бъде така, масивите не могат да съдържат ключ/стойности. Би било полезно, ако можете да публикувате пълното съдържание на обекта вместо конзолното му представяне   -  person Rory McCrossan    schedule 30.09.2016
comment
съжалявам Да, всеки масив съдържа обекти, които съдържат двойки ключ стойност. И добре, знам, че масивите имат индекси със съдържание.   -  person Chris Mazzochi    schedule 30.09.2016
comment
Добавих работещ пример за вас, който показва как да изброите ключовете на обекта.   -  person Rory McCrossan    schedule 30.09.2016


Отговори (3)


Предвид структурата на данните, която сте публикували, можете да използвате Object.keys(), за да изброите ключовете на родителския обект и след това да преминете през свойствата assigned и unassigned в него. Опитайте тази:

Object.keys(configs).forEach(function(key) {
    var config = configs[key];

    config.assigned.forEach(function(assigned) {
        console.log('A: ' + assigned.name + ', ' + assigned.value);
    });

    config.unassigned.forEach(function(assigned) {
        console.log('U: ' + assigned.name + ', ' + assigned.value);
    });
})

var configs = {
  "config1": {
    "assigned": [{
      "name": "Admin Usersss",
      "value": "admin-user"
    }, {
      "name": "MPR User",
      "value": "mpr-user"
    }, {
      "name": "SAMHSA User",
      "value": "samhsa-user"
    }],
    "unassigned": [{
      "name": "States User",
      "value": "states-user"
    }, {
      "name": "All States User",
      "value": "all-states-user"
    }, {
      "name": "Substance Abuse User",
      "value": "substance-abuse-user"
    }]
  },
  "config2": {
    "assigned": [{
      "name": "Admin User",
      "value": "admin-user"
    }, {
      "name": "MPR User",
      "value": "mpr-user"
    }, {
      "name": "SAMHSA User",
      "value": "samhsa-user"
    }, {
      "name": "States User",
      "value": "states-user"
    }, {
      "name": "All States User",
      "value": "all-states-user"
    }],
    "unassigned": [{
      "name": "Substance Abuse User",
      "value": "substance-abuse-user"
    }]
  },
  "config3": {
    "assigned": [{
      "name": "Admin User",
      "value": "admin-user"
    }],
    "unassigned": [{
      "name": "States User",
      "value": "states-user"
    }, {
      "name": "All States User",
      "value": "all-states-user"
    }, {
      "name": "Substance Abuse User",
      "value": "substance-abuse-user"
    }, {
      "name": "MPR User",
      "value": "mpr-user"
    }, {
      "name": "SAMHSA User",
      "value": "samhsa-user"
    }]
  }
}

Object.keys(configs).forEach(function(key) {
  var config = configs[key];
  config.assigned.forEach(function(assigned) {
    console.log(key + ' A: ' + assigned.name + ', ' + assigned.value);
  });
  config.unassigned.forEach(function(assigned) {
    console.log(key + ' U: ' + assigned.name + ', ' + assigned.value);
  });
})

Също така имайте предвид, че (както е посочено от @adeneo в коментарите по вашия въпрос), ако изпълнявате една и съща логика както на assigned, така и на unassigned елементи, тогава можете да ги свържете заедно и да ги итерирате веднъж.

Горният метод ще бъде необходим, ако логиката е различна между свойствата.

person Rory McCrossan    schedule 30.09.2016
comment
Сега как да вземете името и стойността на всяко от присвоените и неприсвоените и да попълните избран елемент с опции, съдържащи резултатите нещо като: $('#shutle-dst').html('‹option value=value›name‹ /опция›'); - person Chris Mazzochi; 30.09.2016
comment
Това е напълно отделна цел, за която трябва да започнете нов въпрос. Въпреки че на подобен въпрос вече е отговорено тук: stackoverflow.com/questions/170986/ - person Rory McCrossan; 30.09.2016
comment
Това определено е трудна техника за програмиране, нали? Новак или по друг начин прав... - person Chris Mazzochi; 30.09.2016

Опитай това:

if(configs.assigned != undefined && configs.assigned != null && configs.assigned.length > 0) {
         // LOOP
}

if(configs.unassigned != undefined && configs.unassigned != null && configs.unassigned.length > 0) {
     // LOOP
}

Проверете тук Javascript unassigned var?

person vvamondes    schedule 30.09.2016

Повторете ключовете на обектите, след това тези ключове на обектите, след това тези масиви от ключове:

for (var config in configs) {
    for (var configType in configs[config]) {
        for (var i = 0; i < configs[config][configType].length; i++) {
            var props = configs[config][configType][i];
            console.log(props);
        }
    }
}
person tymeJV    schedule 30.09.2016