Как отсортировать массив, используя искомый текст в javascript? - PullRequest
0 голосов
/ 03 февраля 2020

Я искал "hr001", и он возвращает весь индекс, имеющий "hr001". Хорошо. Но я хочу отсортировать этот массив, используя искомый текст ("hr001").

Посмотрите на данный код. Здесь возвращает первый и последний элемент этого массива, когда я искал "hr001", и порядок массива: "code": "SFHR001", "code": "HR001".

Так как я искал "hr001" и он полностью соответствует «code»: «HR001», поэтому я хочу показать «code»: «HR001» в качестве первого элемента

var items = [
    {
        "id": 1,
        "code": "SFHR001",
        "property": "8''",
        "description": "Half Round",
        "productGroup": {
            "id": 2,
            "name": "Steel Files",
        }
    },
    {
        "id": 2,
        "code": "MR004",
        "property": "7''",
        "description": "Polished",
        "productGroup": {
            "id": 3,
            "name": "Pliers",
        }
    },
    {
        "id": 2,
        "code": "HR001",
        "property": "7''",
        "description": "Fine Polished",
        "productGroup": {
            "id": 3,
            "name": "Hand Reveter",
        }
    },
]

search = (item, searchedText) => { 

  return item["code"].toLowerCase().indexOf(searchedText.toLowerCase()) > -1
    
}


var ac = items.filter((item) => {
  return search(item, 'hr001');
});

console.log(ac);

// var sortWithInputText = ac.sort(..........................)

enter image description here

Ответы [ 3 ]

1 голос
/ 03 февраля 2020

Вам нужны какие-то логики c, чтобы решить, что ближе всего, ..

Один простой пример может быть основан на длине, поэтому длина результата и длина поискового термина близки, эти go наверх. Вы могли бы сделать более изящную оценку, чем эта, но вам нужно будет решить, к какой логике c это относится. например. Существует даже то, что называется алгоритмом soundex, вы можете объединиться с этим et c. https://en.wikipedia.org/wiki/Soundex

Но используя простой тест длины в качестве руководства, ниже приведен простой пример. Он также возвращается к простому сравнению строк, если баллы каждого элемента равны.

var items = [
    {
        "id": 1,
        "code": "SFHR001",
        "property": "8''",
        "description": "Half Round",
        "productGroup": {
            "id": 2,
            "name": "Steel Files",
        }
    },
    {
        "id": 2,
        "code": "MR004",
        "property": "7''",
        "description": "Polished",
        "productGroup": {
            "id": 3,
            "name": "Pliers",
        }
    },
    {
        "id": 2,
        "code": "HR001",
        "property": "7''",
        "description": "Fine Polished",
        "productGroup": {
            "id": 3,
            "name": "Hand Reveter",
        }
    },
]

search = (item, searchedText) => { 

  return item["code"].toLowerCase().indexOf(searchedText.toLowerCase()) > -1
    
}

const searchTerm = 'hr001';

function score(a) {
  return Math.abs(searchTerm.length - a.code.length);
}


var ac = items.filter((item) => {
  return search(item, searchTerm);
}).sort((a, b) => {
  //sort by score, if equal fall back to compare.
  return score(a) - score(b) ||
    a.code.localeCompare(b.code);
});

console.log(ac);

// var sortWithInputText = ac.sort(..........................)
1 голос
/ 03 февраля 2020

Вы, похоже, ищете функцию «сортировки по полю».

JS 'Array.prototype.sort Функция принимает необязательный параметр, который является «алгоритмом сортировки». Это просто функция, которая принимает 2 параметра и возвращает -1, если первый параметр должен быть проиндексирован первым, 1, если второй должен быть проиндексирован первым, и 0, если они равны.

https://www.w3schools.com/js/js_array_sort.asp

function sortObjectByField(a, b, field) {
  if (a[field] < b[field]) {
    return -1;
  }
  if (a[field] > b[field]) {
    return 1;
  }
  return 0;
};

items.sort((a, b) => sortObjectByField(a, b, 'code'));
1 голос
/ 03 февраля 2020

Попробуйте это:

items
.filter(el => el.code.toLowerCase().indexOf('hr001')>-1)
.sort((a,b)=> a.code.toLowerCase() < b.code.toLowerCase() ? -1 : 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...