Удаление элемента из массива с использованием индекса в vue JS возвращает неожиданный результат - PullRequest
0 голосов
/ 12 декабря 2018

Итак, у меня есть следующий массив:

var hdr = ("name", "date", "start_time", "selling_item", "total_call", 
           "end_time", "ad_num", "area", "order_num");
//this data is returned from db

Теперь я хочу заменить его соответствующим соглашением об именах, поэтому я делаю это:

renameTableHdr(hdrs){
        var handler = hdrs;

        for(var a = 0; a<hdrs.length; a++){
            // console.log(hdrs[a]);
            var itm = "";
            if(hdrs[a] === 'name'){
                itm = "Name";
            }
            if(hdrs[a] === 'ad_num'){
                itm = "Ad Number";
            }
            if(hdrs[a] === 'date'){
                itm = "Date";
            }
            if(hdrs[a] === 'order_num'){
                itm = "Order Number";
            }
            if(hdrs[a] === 'start_time'){
                itm = "Start Time";
            }
            if(hdrs[a] === 'area'){
                itm = "Area";
            }
            if(hdrs[a] === 'selling_item'){
                itm = "Selling Item";
            }
            if(hdrs[a] === 'end_time'){
                itm = "End Time";
            }
            if(hdrs[a] === 'total_call'){
                itm = "Total Call";
            }

            if(handler.indexOf(hdrs[a]) >= 0){
                handler.splice(handler.indexOf(hdrs[a]),1);
            }
            this.tempTblHdr.push(itm);
        }
    },

Так что если я непри сращивании возвращаемые данные верны или ожидаемы.Но с соединением, это не очень хорошо.

Результат без сращивания

(9) ["Ad Number", "Date", "Order Number", "Start Time", "Name", "Area", "Selling Item", "End Time", "Total Call", __ob__: Observer]

С соединением

(5) ["Ad Number", "Order Number", "Name", "Selling Item", "Total Call", __ob__: Observer]
//other 4 data are missing

Я удаляю эти элементы из handler, поскольку они являются основными необходимыми данными, которые должны соответствовать надлежащему соглашению об именах, и есть вероятность, что они будут добавлены.Я переименовываю их, не трогая и не меняя их индексы.Я правильно делаю splice?

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Я бы упростил перевод следующим образом, не изменяя и не используя циклы:

function renameTableHdr(hdrs) {
  // console.log(hdrs[a]);
  const translate = {
    name: 'Name',
    ad_num: 'Ad Number',
    date: 'Date',
    order_num: 'Order Number',
    start_time: 'Start Time',
    area: 'Area',
    selling_item: 'Selling Item',
    end_time: 'End Time',
    total_call: 'Total Call',
    'things with spaces':'Translates fine'
  };
  return hdrs.map((item) => translate[item] || "");
}

console.log(
  renameTableHdr([
    'name',
    'date',
    'start_time',
    'selling_item',
    'total_call',
    'end_time',
    'ad_num',
    'area',
    'order_num',
    'XXXXXXXXXXXXXXXXXXXXXXXXXX',
    'things with spaces',
  ]),
);
0 голосов
/ 12 декабря 2018

Когда вы удаляете элемент из массива, вы должны делать это задом наперед.Причина в том, что индекс продолжает расти, даже если вы удалили элемент.

Следовательно, если я сделаю:

let array = ["a", "b", "c", "d"];
for (let i = 0; i < array.length; i++) {
  console.log(array.splice(i, 1));
}

При первом входе значение i равно0, поэтому он оценивает array[0] (то есть элемент "a") и удаляет его из массива.

На второй итерации i будет 1, а мой массивтеперь ["b", "c", "d"], array[i] будет "c".

После пропуска "b" и удаления "c" массив будет ["b", "d"].На третьей итерации i будет 2, и, поскольку это массив, 2 больше array.length, он на этом остановится.

Если вы сделаете это в обратном порядке, он удалит *Сначала 1028 *, затем "c" и т. Д., То есть ничего не пропускает.

Поскольку вы беспокоитесь о своей индексации, просто добавьте элементы с самого начала с помощью unsifht:

  renameTableHdr(hdrs){
    var handler = hdrs;

    for(var a = hdrs.length-1; a>=0; a--){
      // console.log(hdrs[a]);
      var itm = "";

      if(hdrs[a] === 'name'){
        itm = "Name";
      }
      if(hdrs[a] === 'ad_num'){
        itm = "Ad Number";
      }
      if(hdrs[a] === 'date'){
        itm = "Date";
      }
      if(hdrs[a] === 'order_num'){
        itm = "Order Number";
      }
      if(hdrs[a] === 'start_time'){
        itm = "Start Time";
      }
      if(hdrs[a] === 'area'){
        itm = "Area";
      }
      if(hdrs[a] === 'selling_item'){
        itm = "Selling Item";
      }
      if(hdrs[a] === 'end_time'){
        itm = "End Time";
      }
      if(hdrs[a] === 'total_call'){
        itm = "Total Call";
      }

      if(handler.indexOf(hdrs[a]) >= 0){
        handler.splice(handler.indexOf(hdrs[a]),1);
      }
      this.tempTblHdr.unshift(itm);
    }
},
0 голосов
/ 12 декабря 2018

При удалении элемента из массива вы должны зацикливаться в обратном направлении, как это

   renameTableHdr(hdrs){
        var handler = hdrs;

        for(var a = hdrs.length - 1; a >= 0; a--){
            // ...
        }
    }
...