U
Қыр. 27, 2021, 12:11 Т.Қ.

Как взять элемент по значению в массиве js в qml

QML C++, Js

Не пойму, как взять элемент по значению из массива... Хочу дальше что-то делать со значением, не меняя исходного массива...

  1. var original = [1,2,3];
  2.  
  3. function myChange(){
  4. for(var i = 0; i < original.length; ++i){
  5. console.log("original[" + i + "] = " + original[i]);
  6. }
  7. console.log("=======================");
  8.  
  9. var copyed = original.slice(0);
  10. for(var j = 0; j < copyed.length; ++j){
  11. copyed[j] = 10 + j;
  12. console.log("copyed[" + j + "] = " + copyed[j]);
  13. }
  14.  
  15. console.log("=======================");
  16. for(var x = 0; x < original.length; ++x){
  17. console.log("original[" + x + "] = " + original[x]);
  18. }
  19. }

Выводит:

original[0] = 1
original[1] = 2
original[2] = 3
=======================
copyed[0] = 11
copyed[1] = 12
copyed[2] = 13
=======================
original[0] = 11
original[1] = 12
original[2] = 13

Подскажите плиз, как правильно?

1

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

13
P
  • Қыр. 27, 2021, 12:53 Т.Қ.

Qt 5.15.2
Скопировал, ничего не менял:
qml: original[0] = 1
qml: original[1] = 2
qml: original[2] = 3
qml: =======================
qml: copyed[0] = 10
qml: copyed[1] = 11
qml: copyed[2] = 12
qml: =======================
qml: original[0] = 1
qml: original[1] = 2
qml: original[2] = 3

    U
    • Қыр. 27, 2021, 1:07 Т.Қ.

    Не пойму...
    А у меня вот так:

      P
      • Қыр. 28, 2021, 1:48 Т.Қ.

      в JS не силен, но предположу:
      в buffer у тебя объекты, а точнее указатели на них,
      копируя массив, ты копируешь указатели на теже самыt объекты,
      при этом новые объекты не создаются.
      Попробуй просто создасть массив и явно скопировать значения buffer[j]["tip"]

        U
        • Қыр. 28, 2021, 2:27 Т.Қ.

        Про буфер... Хорошая идея, есть над чем подумать, спасибо!

        Вот только опять же... Не совсем понимаю...
        Буфер я наполняю вот так:

        1. function copyToBuffer(){
        2. resetCopyBuffer();
        3. for(var j = 0; j < window.countChildrens; ++j){
        4. if(window.myChildrens[j].selected === true){
        5. var loadedInfo = window.myChildrens[j].getDescription();
        6. buffer.push(loadedInfo);
        7. }
        8. }
        9. }

        Функция getDescriprion возвращает новый объект (вроде?)... Ну по крайней мере не ссылку же он возвращает?!

        1. function getDescription(){
        2. var result = {}
        3. result["myId"] = myId
        4. result["tip"] = tip
        5. result["x"] = x - root.parent.mMarginLeft
        6. result["y"] = y - root.parent.mMarginTop
        7.  
        8. result["myText"] = myText
        9. result["myFontSize"] = myFontSize.toString()
        10. result["chanelsModel"] = chanelsModel
        11.  
        12. return result
        13. }

        Так что именно содержит buffer? Объекты ведь? Не ссылки?
        А если объекты - то почему создавая копию массива у меня происходит изменения в исходном?

          U
          • Қыр. 28, 2021, 2:35 Т.Қ.

          Ну и вопрос)) Как именно скопировать значения?
          Как взять элемент по значению из массива? У меня даже тема так называется)) Не пойму, как взять значения)))

            P
            • Қыр. 28, 2021, 2:56 Т.Қ.
            • (өңделген)

            Так что именно содержит buffer? Объекты ведь? Не ссылки?

            буфер может содержать объекты qml или он содержит указатели на объекты?
            Результат работы твоего кода какбы намекает...

            А если объекты - то почему создавая копию массива у меня происходит изменения в исходном?

            копируются указатели на объект, в новом массиве указатели на все теже объекты, новые не созданы

            Как взять элемент по значению из массива? У меня даже тема так называется)) Не пойму, как взять значения)))

            в первом посте массив числовых значений, а оказывается в программе массив указателей на объекты
            в цикле пройтись по объектам и буфера и скопировать значения в новый массив.

              U
              • Қыр. 28, 2021, 3:29 Т.Қ.
              • (өңделген)

              Как в буфер положить не указатели, а объекты? Я ожидал, что вернется именно объект...

              1. function getDescription(){
              2. var result = {}
              3. return result
              4. }

              Повторять по нескольку раз, что там указатели - не надо))) Это уже понятно из поведения программы благодаря Вашим подсказкам)
              Я же не пойму, как написать код, чтобы в буфере были НЕ указатели)
              Как из qml вернуть объект... Я чет найти не могу)

                P
                • Қыр. 28, 2021, 3:41 Т.Қ.
                • (өңделген)

                примерно так:

                1. var tmpBuff = []
                2. for (let i = 0; i < buffer.length; ++i) {
                3. tmpBuff[i] = buffer[i]["tip"]
                4. }
                  U
                  • Қыр. 28, 2021, 3:49 Т.Қ.
                  • Жауап шешім ретінде белгіленді.

                  Пока написал так:

                  1. let tmpBuf = [];
                  2. for(let jj = 0; jj < buffer.length; ++jj){
                  3. var obj = {};
                  4. for(var key in buffer[jj]){
                  5. obj[key] = buffer[jj][key];
                  6. }
                  7. tmpBuf.push(obj);
                  8. }

                  Но как-то расстраивает необходимость перебирать двойным циклом всё......... Такими темпами к клинописи вернемся))

                  А не подскажете как из qml вернуть объект, а не указатель?)

                    U
                    • Қыр. 28, 2021, 4:20 Т.Қ.

                    Вообще конечно не понятно все-равно)))
                    Если написать: console.log(buffer), то вывод будет:
                    qml: [[object Object],[object Object]]

                    Те вроде как в buffer-е лежат объекты... Почему при копировании программа ведет себя, как будто там именно указатели?

                      U
                      • Қыр. 29, 2021, 12:06 Т.Қ.
                      • (өңделген)

                      И так))) Изыскания привели меня в очередной тупик)) Вдруг кому пригодится...

                      Весь интернет говорит:
                      Метод slice() возвращает новый массив, содержащий (!)копию(!) части исходного массива.

                      1. var buffer2 = [];
                      2. for(var x = 0; x < 5; ++x){
                      3. var obj = {};
                      4. obj["tip"] = 10 + x;
                      5. buffer2.push(obj);
                      6. }
                      7.  
                      8. var tmpBuff = buffer2.slice(0);
                      9. for(var j = 0; j < buffer2.length; ++j){
                      10. console.log("org[" + j + "] : " + buffer2[j]["tip"]);
                      11. }
                      12.  
                      13. console.log("=============");
                      14. for(var jj = 0; jj < tmpBuff.length; ++jj){
                      15. tmpBuff[jj]["tip"] = 20 + jj;
                      16. console.log("cop[" + jj + "] : " + tmpBuff[jj]["tip"]);
                      17. }
                      18.  
                      19. console.log("=============");
                      20. for(var jjj = 0; jjj < buffer2.length; ++jjj){
                      21. console.log("org[" + jjj + "] : " + buffer2[jjj]["tip"]);
                      22. }

                      А на моем примере получается, что при работе с объектами в массиве - этот метод создает новый массив, но НЕ копирует объекты, а втыкает (!)указатели(!) на объекты исходного массива!

                      Правда версия Qt 5.14... Может потом поправили, но было очень забавно найти такой баг)

                      P.s. Всем добра! Отдельное спасибо Pusher! =)

                        P
                        • Қыр. 29, 2021, 12:34 Т.Қ.
                        • (өңделген)

                        Но как-то расстраивает необходимость перебирать двойным циклом всё......... Такими темпами к клинописи вернемся))

                        обход всех элементов массива, обычное дело, посмотри исходники контейнеров c++ или qt

                        Те вроде как в buffer-е лежат объекты... Почему при копировании программа ведет себя, как будто там именно указатели?

                        отладчик умный, выводит содержимое, а не указатели, конкретные адреса объектов в памяти в большинстве случаев бесполезны

                        Метод slice() возвращает новый массив, содержащий (!)копию(!) части исходного массива.

                        верно только для простых типов

                        Весь интернет говорит:

                        пару запросов в гугле: js глубокое копирование, js копировать объект

                        Правда версия Qt 5.14... Может потом поправили, но было очень забавно найти такой баг)

                        не баг

                          U
                          • Қыр. 29, 2021, 12:58 Т.Қ.

                          К сожалению, на тех сайтах, которые мне попадались - этого уточнения нету... Даже перепроверил(
                          Жаль сразу Вы это не вспомнили, когда узнали, что там объекты)

                            Пікірлер

                            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                            Кіріңіз немесе Тіркеліңіз