Массив внутри объекта внутри массива в jQuery - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть следующий источник:

let source = [{ name: "Player1", cars:[{id: 20, count: 11}, {id: 23, count: 6}, {id: 2, count: 5}], cars_total: 22 }, { name: "Player2", cars:[{id: 11, count: 5}, {id: 24, count: 5}, {id: 42, count: 4}], cars_total: 14 }]

Хорошо .. Я ожидаю, что это тот тип хранилища, который я хочу использовать.У игрока может быть несколько машин (идентифицируется по его идентификатору).например,

Игрок1 имеет

  • автомобиль-A (ID 20) 11 раз
  • автомобиль-B (ID 23) 6 раз
  • автомобиль-C (ID 2) 5 раз

и так далее ... Я получаю эту информацию непосредственно с веб-страницы с помощью селекторов.

То, что я хочу сделать, - это вставить информацию вэтот массив выше, а затем выведите его куда-нибудь.

Моя попытка:

        intVehicleId = $('a').attr('vehicle_type_id');
        if(intVehicleId == "undefined") intVehicleId = null;           

        strProfileLinkText = $('a').children('a[href^="/profile/"]').text();

        if(!strProfileLinkText == 0) {
            intGetNamePos = -1;
            intGetCarPos = -1;

            for (var i = 0; i < arrNames.length; i++){
                if(arrNames[i].name == strProfileLinkText) {
                    intGetNamePos = i;
                    break;
                }
            }
            intGetNamePos = -1;
            if(intGetNamePos > -1) {
                //if(arrNames[intGetNamePos].cars.length == 0) intGetCarPos = -1;
                //else intGetCarPos = $.each(arrNames[intGetNamePos].cars, function(idx2, val2) { if(val2.id == intVehicleId) return idx2; });

                //arrNames[intGetNamePos].cars_total++;

                for (var j = 0; j < arrNames[intGetNamePos].cars.length; j++){
                    //if(arrNames[intGetNamePos].cars[j].id == intVehicleId) intGetCarPos = j; break;
                }

                if(intGetCarPos > -1) {
                    //arrNames[intGetNamePos].cars[intGetCarPos].count++; arrNames[intGetNamePos].cars_total++;
                } else {
                    //arrNames[intGetNamePos].cars.push({id:intVehicleId, count:1}); arrNames[intGetNamePos].cars_total++;
                }
            } else {
                //arrNames.push({name:strProfileLinkText, cars:[{id:intVehicleId, count:1}], cars_total:1});

                intCarsId.id = 0; //intVehicleId
                intCarsId.count = 1;
                arrCars.push(intCarsId);

                strTemp.name = strProfileLinkText;
                strTemp.cars = arrCars;
                strTemp.cars_total = 1;
                console.log(strProfileLinkText);
                arrNames.push(strTemp);
            }
        }
    });

Теперь то, что происходит, довольно странно.Иногда

  • ничего не происходит или
  • вместо «22 машины игроком 1, 24 автомобиля игроком 2» пишет «22 автомобиля игроком 1, 24 автомобиля игроком 1» или
  • "1 машина от Игрока 1, 1 машина от Игрока 1, 1 машина от Игрока 1, 1 машина от Игрока 1, 1 машина от Игрока 1, 1 машина от Игрока 1, 1 машина от Игрока 1" ии так далее ...

Я проверял каждую переменную в каждый момент, и все, кажется, хорошо.Но не хранить информацию.Теперь я понятия не имею, что я могу сделать ...

Это правильный способ хранить мою информацию?Или я должен использовать несколько массивов и попытаться объединить их, когда они мне понадобятся?

О, комментарии показывают некоторые другие попытки, сделанные мной.Например, с помощью push и попробуйте объединить автомобили одного класса в один ряд (и увеличить счетчик).

Я с нетерпением жду, чтобы найти решение с вами, ребята :), несмотря на эту странную ситуацию ... Спросите, есливам нужно больше информации.

РЕДАКТИРОВАТЬ:

Input (later i replace the IDs with names):
ID 1 - Player 1
ID 1 - Player 2
ID 2 - Player 2
ID 3 - Player 3
ID 2 - Player 3
ID 1 - Player 2
ID 2 - Player 2

Expected output (of course in a table or whatever):
4x Player 2 | 3x ID 1, 1x ID 2
2x Player 3 | 1x ID 3, 1x ID 2
1x Player 1 | 1x ID 1

1 Ответ

0 голосов
/ 25 апреля 2018

Попробуйте,

const arrIDCars = ["Car A", "Car B", "Car C", "Car D", "Car E"];
const vehicleIdArr = [1, 1, 2, 3, 2, 1, 2, 3, 3, 2, 1, 2, 3, 2, 1, 1];
const strProfileLinkTextArr = ["p1", "p1", "p2", "p2", "p3", "p3", "p2", "p2", "p1", "p1", "p2", "p2", "p3", "p3", "p2", "p2"];

let output = {};
strProfileLinkTextArr.forEach((text, index) => {
    if (typeof output[text] == "undefined") {
        output[text] = {};
    }

    const vId = vehicleIdArr[index];

    if (typeof output[text][arrIDCars[vId - 1]] == "undefined") {
        output[text] = { ...output[text], [arrIDCars[vId - 1]]: 0 };
    }

    output[text][arrIDCars[vId - 1]]++;
});
console.log(output);

Вы можете видеть, что выходной объект содержит количество всех автомобилей, которые есть у каждого человека.

Таким образом, чтобы увидеть все доступные машины определенного человека, сделайте это,

output["person name"]

или

output.personName //(personName is a variable)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...