Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поиск в многомерном объекте/массиве (https://javascript.ru/forum/misc/76692-poisk-v-mnogomernom-obekte-massive.html)

tk.stas 03.02.2019 22:20

Поиск в многомерном объекте/массиве
 
Всем привет!
Помогите решить такую проблему:

Есть массив:
var people = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "john", "dinner": "hummus" }
];


Необходимо сделать поиск с созданием нового массива
>john // => [{ "name": "john", "dinner": "sushi" }, { "name": "john", "dinner": "hummus" }]

Делаю так:
people.filter(function (person) { return person.name== "john" });

Но если регистр букв разный, то ничего не находит.

С помощью .toUpperCase() ошибку выдает, и вообще в данном примере поиск ведется только по имени, а надо чтоб искало по всем объектам.

рони 03.02.2019 22:29

tk.stas,
Цитата:

Сообщение от tk.stas
С помощью .toUpperCase() ошибку выдает,

:-?
<script>
var people = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "john", "dinner": "hummus" }
];
var str = "john"
var obj = people.filter(function (person) { return person.name.toUpperCase() == str.toUpperCase() });
document.write(JSON.stringify(obj, null, 4))

</script>

рони 03.02.2019 22:34

Цитата:

Сообщение от tk.stas
надо чтоб искало по всем

<script>
var people = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "john", "dinner": "hummus" }
];
var str = "sushi";

var obj = people.filter(function (person) { return Object.values(person).some(function(val) {
  return val.toUpperCase() == str.toUpperCase()
})});
document.write(JSON.stringify(obj, null, 4))

</script>

tk.stas 04.02.2019 20:06

Цитата:

Сообщение от рони (Сообщение 503106)
<script>
var people = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "john", "dinner": "hummus" }
];
var str = "sushi";

var obj = people.filter(function (person) { return Object.values(person).some(function(val) {
  return val.toUpperCase() == str.toUpperCase()
})});
document.write(JSON.stringify(obj, null, 4))

</script>

Uncaught TypeError: val.toUpperCase is not a function - если в объекте есть еще массив.
var people = [
  { "name": "bob", "dinner": [ "sushi", "pizza" ] },
  { "name": "john", "dinner": "sushi" },
  { "name": "john", "dinner": "hummus" }
];

рони 04.02.2019 21:41

tk.stas,
<script>
var people = [
  { "name": "bob", "dinner": [ "sushi", "pizza" ] },
  { "name": "john", "dinner": "sushi" },
  { "name": "john", "dinner": "hummus" }
];



var str = "sushi";

function fn(obj) {
  return Object.values(obj).some(function(val) {
  if(Array.isArray(val)) return fn(val);
  return val.toUpperCase() == str.toUpperCase()
})
}

var obj = people.filter(fn);
document.write(JSON.stringify(obj, null, 4))

</script>

tk.stas 05.02.2019 20:01

Цитата:

Сообщение от рони (Сообщение 503142)
tk.stas,
<script>
var people = [
  { "name": "bob", "dinner": [ "sushi", "pizza" ] },
  { "name": "john", "dinner": "sushi" },
  { "name": "john", "dinner": "hummus" }
];



var str = "sushi";

function fn(obj) {
  return Object.values(obj).some(function(val) {
  if(Array.isArray(val)) return fn(val);
  return val.toUpperCase() == str.toUpperCase()
})
}

var obj = people.filter(fn);
document.write(JSON.stringify(obj, null, 4))

</script>

Работает! Но оказывается что .toUpperCase() не работает с числами, т.е. если в массиве есть, например, id: 1549380976705, то выдает ошибку.

рони 05.02.2019 20:41

Цитата:

Сообщение от tk.stas
не работает с числами

так сделайте число строкой

tk.stas 05.02.2019 21:13

Цитата:

Сообщение от рони (Сообщение 503188)
так сделайте число строкой

Понял, спасибо!

рони 05.02.2019 21:21

tk.stas,
return val.toUpperCase() == str.toUpperCase()
return (val + '').toUpperCase() == (str + '').toUpperCase()


Часовой пояс GMT +3, время: 18:28.