0

У меня есть более десяти тысяч объектов, которые представляют некоторую информацию о двух ids, которая выглядит как:Как структурировать поиск на основе двух ключей в Javascript

muchData = [ 
    { 
     ids: ["123", "234"], 
     interestingData: 1 
    }, 
    { 
     ids: ["123", "345"], 
     interestingData: 2 
    }, 
    ... 
]; 

Я в настоящее время использую lodash, чтобы найти один объект, матчи двух ids как:

function findData(id1, id2) { 
    return _.filter(muchData, function(d) { 
     return d.ids.indexOf(id1) > -1 && d.ids.indexOf(id2) > -1 
    }) 
} 

где есть не гарантия того, я буду получать id1 и ID2 (то есть первое значение в массиве ids может быть либо id1 или id2).

Есть ли лучший способ представить эту проблему, чтобы избежать фильтрации всего массива muchData для каждого поиска?

+0

Сколько раз вам нужно называть 'findData'? Стоит ли реструктурировать ваши данные? – Derlin

+0

Потенциально 50+ раз на клиенте. Он помогает заполнять строки информации, поскольку пользователь применяет различные фильтры. Я мог получать данные с сервера каждый раз, когда применяются фильтры, но все остальные данные уже находятся на клиенте, и я пытался избежать этого перехода. Я открыт для реструктуризации данных, но в идеале должен держать все на клиенте. –

+1

Являются ли какие-либо из значений свойств id (в массиве) уникальными? Если это так, я бы предложил объединить отдельные идентификаторы вместе (от 'id: [" 123 "," 234 "]' до 'id:" 123234 "') и выполнить поиск, а затем выполнить поиск по этому объединенному значению свойства * или * создание массива и использование объединенного ключа в качестве индекса (хотя это, вероятно, создаст очень большой массив со множеством пустых/неопределенных записей). Если, однако, нет никаких гарантированных уникальных значений, то вы ограничены поиском, поскольку вы уже имеете * или *, чтобы перепроектировать исходный код, чтобы гарантировать уникальные значения свойств id. –

ответ

0

Вы можете взять хеш-таблицу. С отсортированными идентификаторами для уникальных ключей.

var muchData = [{ ids: ["123", "234"], interestingData: 1 }, { ids: ["123", "345"], interestingData: 2 }, ], 
 
    hash = muchData.reduce(function (r, a, i) { 
 
     var k = a.ids[0] < a.ids[1] ? a.ids[0] + '|' + a.ids[1] : a.ids[1] + '|' + a.ids[0]; 
 
     r[k] = r[k] || []; 
 
     r[k].push(a); 
 
     return r; 
 
    }, {}); 
 

 
document.write('<pre>' + JSON.stringify(hash, 0, 4) + '</pre>');

1

Первоначально (многословный) комментарий, расширил немного в ответ.

Учитывая характер массива:

muchData = [ 
    { 
     ids: ["123", "234"], 
     interestingData: 1 
    }, 
    { 
     ids: ["123", "345"], 
     interestingData: 2 
    }, 
    ... 
]; 

Если, как вы говорите, в your comment to the question:

Идентификаторы гарантированно быть уникальным.

Тогда самый простой подход будет использовать комбинированные id свойства-значения в качестве индекса для массива:

var sortedData = [], 
    muchData.forEach(function (obj, index, array) { 
     sortedData[ parseInt(obj.id.join(''), 10) ] = obj.interestingData; 
    }); 

И затем, используя этот созданный массив для поиска interestingData вы хотите получить. Бонус этого заключается в том, что он должен произойти только один раз (при посещении клиента), но это также, конечно, можно сделать на стороне сервера (только один раз), чтобы упростить его.

Или, а не массив, вы можете преобразовать массив в объект и использовать комбинированные id свойства в качестве ключей (которые могут быть более разумным, чем создание массива с, вероятно, много пустых/неопределенных записей):

muchData = [ 
    { 
     ids: ["123", "234"], 
     interestingData: 1 
    }, 
    { 
     ids: ["123", "345"], 
     interestingData: 2 
    }, 
    ... 
], 
objOfData = {}, 
muchData.forEach(function (obj, index, array) { 
    objOfData[ obj.id.join('') ] = obj; 
});