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

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

QML C++, Js

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

var original = [1,2,3];

function myChange(){
    for(var i = 0; i < original.length; ++i){
        console.log("original[" + i + "] = " + original[i]);
    }
    console.log("=======================");

    var copyed = original.slice(0);
    for(var j = 0; j < copyed.length; ++j){
        copyed[j] = 10 + j;
        console.log("copyed[" + j + "] = " + copyed[j]);
    }

    console.log("=======================");
    for(var x = 0; x < original.length; ++x){
        console.log("original[" + x + "] = " + original[x]);
    }
}

Выводит:

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 Т.Қ.

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

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

        function copyToBuffer(){
            resetCopyBuffer();
            for(var j = 0; j < window.countChildrens; ++j){
                if(window.myChildrens[j].selected === true){
                    var loadedInfo = window.myChildrens[j].getDescription();
                    buffer.push(loadedInfo);
                }
            }
        }
        

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

        function getDescription(){
                var result = {}
                result["myId"] = myId
                result["tip"] = tip
                result["x"] = x - root.parent.mMarginLeft
                result["y"] = y - root.parent.mMarginTop
        
                result["myText"] = myText
                result["myFontSize"] = myFontSize.toString()
                result["chanelsModel"] = chanelsModel
        
                return result
            }
        

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

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

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

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

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

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

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

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

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

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

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

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

              function getDescription(){
                  var result = {}
                  return result
              }
              

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

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

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

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

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

                  let tmpBuf = [];
                  for(let jj = 0; jj < buffer.length; ++jj){
                      var obj = {};
                      for(var key in buffer[jj]){
                          obj[key] = buffer[jj][key];
                      }
                      tmpBuf.push(obj);
                  }
                  

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

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

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

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

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

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

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

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

                          var buffer2 = [];
                          for(var x = 0; x < 5; ++x){
                              var obj = {};
                              obj["tip"] = 10 + x;
                              buffer2.push(obj);
                          }
                      
                          var tmpBuff = buffer2.slice(0);
                          for(var j = 0; j < buffer2.length; ++j){
                              console.log("org[" + j + "] : " + buffer2[j]["tip"]);
                          }
                      
                          console.log("=============");
                          for(var jj = 0; jj < tmpBuff.length; ++jj){
                              tmpBuff[jj]["tip"] = 20 + jj;
                              console.log("cop[" + jj + "] : " + tmpBuff[jj]["tip"]);
                          }
                      
                          console.log("=============");
                          for(var jjj = 0; jjj < buffer2.length; ++jjj){
                              console.log("org[" + jjj + "] : " + buffer2[jjj]["tip"]);
                          }
                      

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

                      Правда версия 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 Т.Қ.

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

                            Пікірлер

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