Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.02.2019, 22:20
Аспирант
Отправить личное сообщение для tk.stas Посмотреть профиль Найти все сообщения от tk.stas
 
Регистрация: 25.02.2015
Сообщений: 41

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

Есть массив:
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() ошибку выдает, и вообще в данном примере поиск ведется только по имени, а надо чтоб искало по всем объектам.
Ответить с цитированием
  #2 (permalink)  
Старый 03.02.2019, 22:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

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>
Ответить с цитированием
  #3 (permalink)  
Старый 03.02.2019, 22:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от 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>
Ответить с цитированием
  #4 (permalink)  
Старый 04.02.2019, 20:06
Аспирант
Отправить личное сообщение для tk.stas Посмотреть профиль Найти все сообщения от tk.stas
 
Регистрация: 25.02.2015
Сообщений: 41

Сообщение от рони Посмотреть сообщение
<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" }
];

Последний раз редактировалось tk.stas, 04.02.2019 в 20:38.
Ответить с цитированием
  #5 (permalink)  
Старый 04.02.2019, 21:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

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>
Ответить с цитированием
  #6 (permalink)  
Старый 05.02.2019, 20:01
Аспирант
Отправить личное сообщение для tk.stas Посмотреть профиль Найти все сообщения от tk.stas
 
Регистрация: 25.02.2015
Сообщений: 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>
Работает! Но оказывается что .toUpperCase() не работает с числами, т.е. если в массиве есть, например, id: 1549380976705, то выдает ошибку.
Ответить с цитированием
  #7 (permalink)  
Старый 05.02.2019, 20:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от tk.stas
не работает с числами
так сделайте число строкой
Ответить с цитированием
  #8 (permalink)  
Старый 05.02.2019, 21:13
Аспирант
Отправить личное сообщение для tk.stas Посмотреть профиль Найти все сообщения от tk.stas
 
Регистрация: 25.02.2015
Сообщений: 41

Сообщение от рони Посмотреть сообщение
так сделайте число строкой
Понял, спасибо!
Ответить с цитированием
  #9 (permalink)  
Старый 05.02.2019, 21:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

tk.stas,
return val.toUpperCase() == str.toUpperCase()
return (val + '').toUpperCase() == (str + '').toUpperCase()
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Живой поиск JQUERY + AJAX + PHP + MYSQL dimi007 AJAX и COMET 2 22.07.2014 13:50
select отключить встроенный поиск skynet-mfd jQuery 0 04.03.2013 11:26
Поиск в тексте javascript jQuery 3 31.05.2011 11:40
PagingToolbar и поиск DenQ ExtJS 5 02.11.2010 00:16
Поиск в массиве через JavaScript Noran Общие вопросы Javascript 0 10.08.2008 17:31