Поиск Javascript Массив объектов

1

Я пытаюсь отфильтровать массив объектов javascript по строке. Но я хочу, чтобы фильтр смотрел на каждое свойство и проверял его, чтобы убедиться, что строка действительна. У AngularJS есть встроенный фильтр, который делает это, но я не могу найти для него никаких решений на SO.

[
    {
        "title":"Mr.",
        "name":"John Smith",
        "firstName":"John",
        "lastName":"Smith"
    },
    {
        "title":"Mr.",
        "name":"Bill Smith",
        "firstName":"Bill",
        "lastName":"SMith"
    }

]

Так, например, если я ввел "Jo" для текстовой строки, он вернет объект в индекс 0, что довольно легко сделать, если вы просто хотите выполнить поиск по одному свойству.

Теперь, если я войду в "Mr", он должен вернуть оба элемента в индекс 0 и индекс 1, потому что мы ищем все свойства.

Надеюсь, это имеет смысл в отношении того, что я прошу.

РЕДАКТИРОВАТЬ: Очень жаль было поздно ночью прошлой ночью, и я оставил очень важные детали в структуре данных.

{
        "title":"Mr.",
        "name":"John Smith",
        "firstName":"John",
        "lastName":"Smith",
        "contactType":{
            "name":"test"
        },
        "addresses":[
            {"address":"Test Street One"},
            {"address":"Test Street Two"},
        ]
    },
    {
        "title":"Mr.",
        "name":"Bill Smith",
        "firstName":"Bill",
        "lastName":"SMith",
        "contactType":{
            "name":"test"
        },
        "addresses":[
            {"address":"Test Street One"},
            {"address":"Test Street Two"},
        ]
    }

Таким образом, в этом случае поиск учитывал бы любой тип и любое количество вложенных объектов внутри объектов. Извините, что забыли эту часть.

  • 0
    «Я пытаюсь ...», покажи нам, что ты пытался.
Теги:

3 ответа

1

Вы можете использовать комбинацию Array#filter и Object.values для достижения этой цели:

let data = [{
    "title": "Mr.",
    "name": "John Smith",
    "firstName": "John",
    "lastName": "Smith"
  },
  {
    "title": "Mr.",
    "name": "Bill Smith",
    "firstName": "Bill",
    "lastName": "SMith"
  }

];

let string = 'Jo';
let results = data.filter(item => Object.values(item).some(value => value.includes(string)));

console.log(results);
  • 1
    Вы можете сократить его, чтобы let results = data.filter(item => Object.values(item).some(value => value.includes(string))); так как это будет автоматически возвращено.
1

Вы можете прокручивать объекты массива и использовать indexof для поиска элементов, которые имеют входную строку,

DEMO

var myarray =[
    {
        "title":"Mr.",
        "name":"John Smith",
        "firstName":"John",
        "lastName":"Smith"
    },
    {
        "title":"Mr.",
        "name":"Bill Smith",
        "firstName":"Bill",
        "lastName":"SMith"
    }

];
var toSearch = "Mr";
var results =[];
for(var i=0; i<myarray.length; i++) {
  for(key in myarray[i]) {
    if(myarray[i][key].indexOf(toSearch)!=-1) {
      results.push(myarray[i]);
    }
  }
  }
  
  console.log(results)
  • 0
    Есть ли причина, по которой вы не используете функцию фильтрации массивов?
  • 0
    нет, вы все еще можете использовать фильтр, просто я объяснил логику
0

Прокрутите все свойства для каждого объекта:

var items = [{
    "title": "Mr.",
    "name": "John Smith",
    "firstName": "John",
    "lastName": "Smith"
}, {
    "title": "Mr.",
    "name": "Bill Smith",
    "firstName": "Bill",
    "lastName": "SMith"
}];

console.log("Jo :", items.filter(x => contains(x, "Jo")).map(x => x.name));
console.log("Mr :", items.filter(x => contains(x, "Mr")).map(x => x.name));

function contains (x, w) {
  for (let k in x) {
    if (x[k].indexOf(w) !== -1) {
      return true;
    }
  }
  return false;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню