поиск объектов внутри массива на основе ключа с массивом в качестве значения - PullRequest
0 голосов
/ 14 октября 2019

У меня есть массив объектов, и у каждого объекта есть массив идентификаторов, и я хочу вернуть массив объектов с определенным идентификатором без использования es6.

var items = [
 {name: 'item 1', id: ['1', '2']},
 {name: 'item 2', id: ['2', '3']},
 {name: 'item 3', id: ['3']},
 {name: 'item 1', id: ['2', '4']},
];

Я хочу вернуть всеобъекты с идентификатором 3

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Предполагая, что ваши id массивы отсортированы, вы можете сделать это в O(n log k ), используя двоичный поиск, где n - это число item с, а k - это размер самого большого массива id.

var values = [];
items.forEach( function(item) {
   var res = binarySearch( item[id], 3 );
   if ( res != -1 ) {
     values.push(item);
   }
});

function binarySearch (arr, val) {
    var lo = 0;
    var hi = arr.length - 1;

    while (lo <= hi) {
        var mid = lo + ( hi - lo ) / 2;

        if (arr[mid] === val) {
            return mid;
        }
        if (val < arr[mid]) {
            hi = mid - 1;
        } else {
            lo = mid + 1;
        }
    }
    return -1;
}
0 голосов
/ 15 октября 2019

Если вы не можете использовать синтаксис ES6, вы всегда можете просто использовать старый добрый цикл:

function findById(items, id){
    var result = [];
    for(var i = 0; i < items.length; i++)
        for(var j = 0; j < items[i].id.length; j++)
            if(items[i].id[j] === id){
                result.push(items[i]);
                break;
            }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...