03.02.2019, 22:20
|
Аспирант
|
|
Регистрация: 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() ошибку выдает, и вообще в данном примере поиск ведется только по имени, а надо чтоб искало по всем объектам.
|
|
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>
|
|
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>
|
|
04.02.2019, 20:06
|
Аспирант
|
|
Регистрация: 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.
|
|
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>
|
|
05.02.2019, 20:01
|
Аспирант
|
|
Регистрация: 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, то выдает ошибку.
|
|
05.02.2019, 20:41
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Сообщение от tk.stas
|
не работает с числами
|
так сделайте число строкой
|
|
05.02.2019, 21:13
|
Аспирант
|
|
Регистрация: 25.02.2015
Сообщений: 41
|
|
Сообщение от рони
|
так сделайте число строкой
|
Понял, спасибо!
|
|
05.02.2019, 21:21
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
tk.stas,
return val.toUpperCase() == str.toUpperCase()
return (val + '').toUpperCase() == (str + '').toUpperCase()
|
|
|
|