поиск элемента в наблюдаемом массиве без учета регистра - PullRequest
0 голосов
/ 12 ноября 2019

Я пытаюсь сравнить элементы в 2 массивах:

   ko.utils.arrayForEach(arrList, function (item) {
     if (arrList2().findIndex(a => item.toLowerCase() === a.toLowerCase())>=0) {
          // found similar item in arrlist2, so, handle it
     }
    }

Но это не работает. По сути, я хочу проверить, присутствует ли элемент в arrList в arrList2 (проверка без учета регистра), оба являются наблюдаемыми массивами. Есть предложения?

Ответы [ 2 ]

1 голос
/ 12 ноября 2019

вы можете использовать var differences = ko.utils.compareArrays(arrList(), arrList2());
Это даст вам массив с элементами, которые выглядят следующим образом {status: "added", value: originalItem}

Состояние будет одним из этих трех значений added, deleted, retained
Естьпосмотрите на эту статью - Функции утилит в KnockoutJS

var data = [
  {
    id: 1,
    name: "Test 1"
  },
  {
    id: 2,
    name: "Test 2"
  },
  {
    id: 3,
    name: "Test 3"
  }
];

function ViewModel() {
  var self = this;

  self.list1 = ko.observableArray(data.slice(0));
  self.list2 = ko.observableArray(data.slice(0));

  var item = data[0];
  self.list2.remove(item);
  self.list2().push({
    id: 5,
    name: "Test 5"
  });

  self.listDiff = ko.pureComputed(function() {
    return ko.utils.compareArrays(self.list1(), self.list2());
  });

  self.listReverseDiff = ko.pureComputed(function() {
    return ko.utils.compareArrays(self.list2(), self.list1());
  });

  self.sameItems = ko.pureComputed(function() {
    return self.list1().filter(function(item1) {
      var arr = self.list2().filter(function(item2) {
        return (
          item1.name.toString().toLowerCase() ===
          item2.name.toString().toLowerCase()
        );
      });
      return arr.length > 0;
    });
  });
}
var vm = new ViewModel();

ko.applyBindings(vm);

List 1

Список 2

Элементы в списке 1, которые существуют в списке 2

Список 1

-

Список 2

-

Список1 против списков2 различия

Список 2 и различия Списка 1

0 голосов
/ 13 ноября 2019

Вы можете использовать Array.prototype.map для создания строчной версии arrayList2, а затем выяснить, встречается ли элемент из arrayList1 в arrayList2, будет тривиально:

let arrList2LC = arrList2().map((item) => item.toLowerCase());

arrList1().forEach((item) => {
    if (arrList2LC.indexOf(item.toLowerCase() > -1) {
        // item is present in arrList2
    }
});
...