Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.01.2019, 11:29
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 206

Как правильно отсортировать свойства массива по вхождению (native js)?
Здравствуйте. Подскажите, пожалуйста, как правильно решить следующую задачу. У меня есть следующий массив.
let arr = [
    {
        id: 1,
        firstName: 'John',
        lastName: 'Smith'
    },
    {
        id: 2,
        firstName: 'Brady',
        lastName: 'Dennis'
    },
    {
        id: 3,
        firstName: 'Sandoval',
        lastName: 'Pratt'
    },
    {
        id: 4,
        firstName: 'Davis',
        lastName: 'Andrews'
    }
]

Мне необходимо при вводе в:
<input type="text">

например следующее значение:
Код:
John Denn
отсортировать массив следующим образом (без учета регистра):
let arr = [
    {
        id: 1,
        firstName: 'John',
        lastName: 'Smith'
    },
    {
        id: 2,
        firstName: 'Brady',
        lastName: 'Dennis'
    }
]

или например (без учета регистра)
Код:
Pratt Sm
let arr = [
    {
        id: 3,
        firstName: 'Sandoval',
        lastName: 'Pratt'
    },
    {
        id: 1,
        firstName: 'John',
        lastName: 'Smith'
    }
]

Буду благодарен любой помощи.

Последний раз редактировалось s24344, 23.01.2019 в 12:16.
Ответить с цитированием
  #2 (permalink)  
Старый 23.01.2019, 12:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

s24344,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
</head>

<body>
<ul class="list"></ul>
 <script>
function fn(arr, pattern) {
    pattern = new RegExp("^(" + pattern.trim().replace(/\s+/g, "|") + ")", "i");
    return arr.filter(function(el) {
        return Object.values(el).some(function(val) {
            return pattern.test(val)
        })
    })
};

let arr = [
    {
        id: 1,
        firstName: 'John',
        lastName: 'Smith'
    },
    {
        id: 2,
        firstName: 'Brady',
        lastName: 'Dennis'
    },
    {
        id: 3,
        firstName: 'Sandoval',
        lastName: 'Pratt'
    },
    {
        id: 4,
        firstName: 'Davis',
        lastName: 'Andrews'
    }
]
,
pattern = 'Pratt Sm',
arrFilter = fn(arr, pattern),
html = arrFilter.reduce(function(html, el) {
 return html +=  '<li class="item" ><div>'+el.firstName+' '+ el.lastName+'</div></li>'
},"");
document.querySelector(".list").innerHTML = html;
</script>

</body>
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 23.01.2019, 13:08
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 206

Спасибо за помощь.
Ответить с цитированием
  #4 (permalink)  
Старый 23.01.2019, 18:20
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 206

Рони, вы могли бы ещё подсказать, как защититься, чтобы не ломался код, вот от таких вхождений:
// let pattern = '*';
let pattern = '\';
Ответить с цитированием
  #5 (permalink)  
Старый 23.01.2019, 18:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

s24344,
function escapeRegExp(string){
    return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}

function fn(arr, pattern) {
        pattern = escapeRegExp(pattern);
        pattern = new RegExp("^(" + pattern.trim().replace(/\s+/g, "|") + ")", "i");
        return arr.filter(function(el) {
                return Object.values(el).some(function(val) {
                        return pattern.test(val)
                })
        })
};
Ответить с цитированием
  #6 (permalink)  
Старый 23.01.2019, 18:50
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

s24344,
или формируйте RegExp сами и тогда
let pattern = /^(Pratt|Sm)/i;

function fn(arr, pattern) {
                return arr.filter(function(el) {
                return Object.values(el).some(function(val) {
                        return pattern.test(val)
                })
        })
};
Ответить с цитированием
  #7 (permalink)  
Старый 23.01.2019, 19:10
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 206

Спасибо.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива с объектами на javascript sergiu920 Элементы интерфейса 2 07.12.2018 09:47
iframe как правильно динамически встаить с помощью js syegorius Events/DOM/Window 7 05.01.2012 10:24
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14
Как правильно прописать свой код в .js Всеми_Любимый Элементы интерфейса 6 23.02.2010 21:34
Как правильно послать XML в POST запросе LowCoder AJAX и COMET 10 15.07.2009 23:20