JavaScript: фильтр () для объектов - PullRequest
114 голосов
/ 22 февраля 2011

ECMAScript 5 имеет прототип filter() для типов Array, но не Object типов, если я правильно понимаю.

Как мне реализовать filter() для Object s в JavaScript?

Допустим, у меня есть этот объект:

var foo = {
    bar: "Yes"
};

И я хочу написать filter(), который работает на Object s:

Object.prototype.filter = function(predicate) {
    var result = {};

    for (key in this) {
        if (this.hasOwnProperty(key) && !predicate(this[key])) {
            result[key] = this[key];
        }
    }

    return result;
};

Это работает, когда я использую его в следующей демонстрации, но когда я добавляю его на свой сайт, который использует jQuery 1.5 и jQuery UI 1.8.9, я получаю ошибки JavaScript в FireBug.

Object.prototype.filter = function(predicate) {
  var result = {};
  for (key in this) {
    if (this.hasOwnProperty(key) && !predicate(this[key])) {
      console.log("copying");
      result[key] = this[key];
    }
  }
  return result;
};

var foo = {
  bar: "Yes",
  moo: undefined
};

foo = foo.filter(function(property) {
  return typeof property === "undefined";
});

document.getElementById('disp').innerHTML = JSON.stringify(foo, undefined, '  ');
console.log(foo);
#disp {
  white-space: pre;
  font-family: monospace
}
<div id="disp"></div>

Ответы [ 11 ]

0 голосов
/ 04 сентября 2018

В этих случаях я использую jquery $ .map, который может обрабатывать объекты.Как уже упоминалось в других ответах, не рекомендуется менять собственные прототипы (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain#Bad_practice_Extension_of_native_prototypes)

. Ниже приведен пример фильтрации просто путем проверки некоторого свойства вашего объекта. Он возвращает собственный объект, если ваше условие истинноили возвращает undefined, если нет. Свойство undefined заставит эту запись исчезнуть из списка объектов;

$.map(yourObject, (el, index)=>{
    return el.yourProperty ? el : undefined;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...