【问题标题】:Multi select check box with index带索引的多选复选框
【发布时间】:2017-05-09 06:12:59
【问题描述】:

我有一个多选复选框,如下所示。在此方法getMultiSelectedItems() 上检索所选项目,如下所示。假设我选择了一项。

checked:true,
display: "Co-sleep with parent(s)",
encode : "1",
label :  "uiCoSleepNight"

你能告诉我如何在上面的对象上包含被选中项目的index 吗?我们可以将index视为inputs数组的顺序。

注意:实际上,我需要所选项目的index。希望有办法修改getMultiSelectedItems() 来获得它。换句话说,index 属于用户选择的array

.html

<ion-list>
        <ion-item *ngFor="let i of inputs">
          <ion-label>{{i.display}}</ion-label>
          <ion-checkbox name="{{i.label}}" [(ngModel)]="i.checked"></ion-checkbox>
        </ion-item>
      </ion-list>

.ts

 //get Multi Selected Items
  getMultiSelectedItems(): any {
    return this.inputs.filter(opt => opt.checked);
  }

    this.inputs= [
        {
            "encode": "1",
            "display": "Own bed/crib in own room",
            "label": "uiOwnRoomOwnBedNight",
            "checked": false
        },
        {
            "encode": "1",
            "display": "Own bed/crib but share room with sibling(s)",
            "label": "uiSharedRoomOwnBedNight",
            "checked": false
        },
        {
            "encode": "1",
            "display": "Own bed/crib but share room with parent(s)",
            "label": "uiParentRoomOwnBedNight",
            "checked": false
        },
        {
            "encode": "1",
            "display": "Co-sleep with parent(s)",
            "label": "uiCoSleepNight",
            "checked": false
        },
    ],

【问题讨论】:

  • 我对@9​​87654332@ 感到困惑,你能解释更多吗?
  • 实际上,我需要selected itemindex。希望有办法修改getMultiSelectedItems() 来获得它。换句话说,index 属于用户选择的array。 @Pengyy

标签: javascript angular ionic-framework ionic2 ionic3


【解决方案1】:

您可以在过滤器中获得的第二个值是索引。

return this.inputs.filter((opt, i) => {
    if(opt.checked) {opt.index = i; return true;}
        });

【讨论】:

  • 正是我需要的。非常感谢:)
【解决方案2】:

希望我能得到你的意见。您可以使用Array.map 生成一个新的array,其中Array.filter 的结果包含原始数据及其来自原始数组的索引。

function getMultiSelectedItems() {
  var arr = [];
  return this.inputs.filter(opt => opt.checked)
                    .map(item => {return {"index": inputs.indexOf(item), "data": item};});
}

var inputs = [{
    "encode": "1",
    "display": "Own bed/crib in own room",
    "label": "uiOwnRoomOwnBedNight",
    "checked": false
  },
  {
    "encode": "1",
    "display": "Own bed/crib but share room with sibling(s)",
    "label": "uiSharedRoomOwnBedNight",
    "checked": true
  },
  {
    "encode": "1",
    "display": "Own bed/crib but share room with parent(s)",
    "label": "uiParentRoomOwnBedNight",
    "checked": false
  },
  {
    "encode": "1",
    "display": "Co-sleep with parent(s)",
    "label": "uiCoSleepNight",
    "checked": true
  },
];

console.log(getMultiSelectedItems());

或者你可以简单地使用Array.indexOfArray.filter 的结果,但请记住,如果对象的实例(Array.filter 的元素)发生更改,这将不起作用。

function getMultiSelectedItems() {
  return this.inputs.filter(opt => opt.checked);
}

var inputs = [{
    "encode": "1",
    "display": "Own bed/crib in own room",
    "label": "uiOwnRoomOwnBedNight",
    "checked": false
  },
  {
    "encode": "1",
    "display": "Own bed/crib but share room with sibling(s)",
    "label": "uiSharedRoomOwnBedNight",
    "checked": true
  },
  {
    "encode": "1",
    "display": "Own bed/crib but share room with parent(s)",
    "label": "uiParentRoomOwnBedNight",
    "checked": false
  },
  {
    "encode": "1",
    "display": "Co-sleep with parent(s)",
    "label": "uiCoSleepNight",
    "checked": true
  },
];

getMultiSelectedItems().forEach(item => console.log(inputs.indexOf(item)));

【讨论】:

  • 我已经尝试过你的第一个解决方案。但它不起作用:(总是undefined
  • @Sampath by not working,表示错误?还是新问题?
  • 它返回undefined。无论如何,其他用户的解决方案正在运行。感谢您的支持:)
  • @Sampath 好的,如果您不介意向原始数据添加新属性,那么 misha130 的回答很好。
猜你喜欢
  • 2013-10-03
  • 1970-01-01
  • 2020-10-17
  • 2016-10-08
  • 2018-10-13
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多