跟踪数组javascript的删除索引

时间:2016-11-15 12:24:47

标签: javascript jquery checkbox

我有一个带有文本框和复选框的表单。当我将值填充到复选框时,该值将被推送到一个数组中。当我取消选中该复选框时,该值将从该数组中删除。 这是我的工作code pen.

这是我的表单代码

<label class="item item-input">
    <input type="text" placeholder="In a word, what is important to you?" ng-model="values.first" >
    <ion-checkbox ng-click="toggleCheckBox(success.first,values.first)"  ng-change="show2='true'" ng-model="success.first"  
           ng-disabled="!values.first" style="border: none;padding-left: 30px;" class="checkbox-royal"></ion-checkbox>
  </label>

  <label class="item item-input" ng-show="show2" ng-class="{'animated-custom slideInLeft':success.first}">
    <input type="text" placeholder="What else is important to you?" ng-model="values.second" >

    <ion-checkbox class="checkbox-royal" ng-model="success.second" ng-click="toggleCheckBox(success.second,values.second)" ng-change="show3='true'" ng-disabled="!values.second" style="border: none;padding-left: 30px;"></ion-checkbox>
  </label>

  <label class="item item-input" ng-show="show3" ng-class="{'animated-custom slideInLeft':success.second}">
    <input type="text" placeholder="What else is important to you?" ng-model="values.third">

    <ion-checkbox class="checkbox-royal" ng-model="success.third" ng-click="toggleCheckBox(success.third,values.third)" ng-change="show4='true'" ng-disabled="!values.third" style="border: none;padding-left: 30px;"></ion-checkbox>
  </label>

  <label class="item item-input" ng-show="show4" ng-class="{'animated-custom slideInLeft':success.third}">
    <input type="text" placeholder="What else is important to you?" ng-model="values.four">

    <ion-checkbox class="checkbox-royal" ng-model="success.four" ng-click="toggleCheckBox(success.four,values.four)" ng-change="show5='true'" ng-disabled="!values.four" style="border: none;padding-left: 30px;"></ion-checkbox>
  </label>

这是控制器代码,

.controller('myctrl',function($scope){
  var values=[];
  $scope.toggleCheckBox=function(isChecked, value){
    if(isChecked){
      values.push(value);
      console.log(values);
    }else{
      var currentIndex = values.indexOf(value);
      values.splice(currentIndex, 1);
      console.log(values);
       //console.log(values.indexOf(value));
    }
  }
})

问题是,当我从数组中删除值并再次选中复选框时,它会将值推送到最后。是否可以在数组中保留该值的原始位置?

4 个答案:

答案 0 :(得分:1)

toggleCheckBox中传递项目索引,并根据传递的索引和您想要的值设置数组项的值:

var x = Array();
var index = 2;
x[index] = 'A';
console.log(x);

但请确保何时使用数组迭代它并使用undefined值拼接项目。

答案 1 :(得分:1)

使用位置向toggleCheckBox添加第三个参数 - 例如:

...
<ion-checkbox class="checkbox-royal" ng-model="success.four" ng-click="toggleCheckBox(success.four,values.four,4)"
...

并在您的控制器中:

.controller('myctrl',function($scope){
  var values=[];
  $scope.toggleCheckBox=function(isChecked, value, pos){
    if(isChecked){
      values[pos] = value;
    }else{
      values[pos] = null;
    }
    console.log(values);
  }
})

答案 2 :(得分:1)

理论上,您可以为数组中的特定索引添加值:

let arr = ['foo', 'bar'];
arr[3] = 'baz'; // 0 and 1 are taken
console.log(arr); //=> ['foo', 'bar', undefined, 'baz']

但不建议这样做。在JavaScript中,数组是编号索引,尝试解决此问题可能很快就会出现问题。

你需要的是一个对象。如果您为输入命名:

<input name="some_checkbox_1">

...并使用这些名称创建一个对象:

$scope.toggleCheckBox=function(isChecked, value){
    values[this.name] = isChecked;
}

这导致像这样的对象:

{ some_checkbox_1: true, some_checkbox_2: false } // this is the `values` variable

如果您希望使用true和/或false值从此对象中获取数组,请使用Object.values()

Object.values(values); //=> [true, false]

这样,您可以按顺序呈现复选框,并根据存储对象的true / false值将它们设置为checked。希望这会有所帮助。

注意:在上面的代码中,我假设this引用复选框的HTML元素

答案 3 :(得分:1)

JavaScript对象属性顺序永不改变

因此,您可以创建一个Object来维护顺序并迭代Object.keys()以根据valuesvalue方式填充数组false

angular
  .module('ionicApp', ['ionic'])
  .controller('myctrl', function ($scope) {
    var values = [],
        obj = {};

    $scope.toggleCheckBox = function (isChecked, value, index) {
        values = []; // Clean the values
        obj[index] = (isChecked) ? value : false;
        Object.keys(obj).forEach(function (k) {
            obj[k] && values.push(obj[k]); // Fill the ordered values
        });

        console.clear();
        console.log(values);
    };
  });

在veiew中,我为所有复选框添加了index,这是ion-checkbox的编号:

<ion-checkbox 
  ng-click="toggleCheckBox(success.first,values.first, 1)"  
  ng-change="show2='true'" 
  ng-model="success.first"
  ng-disabled="!values.first" 
  style="border: none;padding-left: 30px;"
  class="checkbox-royal">
</ion-checkbox>

Code Pen检查完整的解决方案。