Цикл по двум массивам в JavaScript одновременно - PullRequest
0 голосов
/ 08 июля 2019
let masterList=[{id:1,name:'Abc'},{id:2,name:'Def'},{id:3,name:'Ghi'}];
let selectedList=[2,3];

Желаемый результат должен иметь

//desiredList=[{id:2,name:'Def'},{id:3,name:'Ghi'}]

В настоящее время я делаю

     let parsedArray = [];
      masterList.forEach(mItem => {
            selectedList.forEach(sItem => {
                if (mItem.id === sItem) {
                    parsedArray.push(mItem);
                }
            });
        });
     desiredList=parsedArray

Я не считаю этот метод эффективным при переборе больших массивов,Есть ли логика, любые встроенные операторы JavaScript, с помощью которых я могу добиться того же?

Ответы [ 6 ]

4 голосов
/ 08 июля 2019

Вы можете взять map с id в качестве ключа и объект в качестве значения и отобразить требуемые значения из карты, отобразив selectedList.

В этом подходе используется порядок от selectedList.

var masterList = [{ id: 1, name: 'Abc' }, { id: 2, name: 'Def' }, { id: 3, name: 'Ghi' }],
    selectedList = [2, 3],
    result = selectedList.map(Map.prototype.get, new Map(masterList.map(o => [o.id, o])));

console.log(result);
3 голосов
/ 08 июля 2019

Для этого вы можете использовать массив filter().

Демонстрация:

let masterList=[{id:1,name:'Abc'},{id:2,name:'Def'},{id:3,name:'Ghi'}];
let selectedList=[2,3];

let desiredList = masterList.filter((val) => selectedList.includes(val.id));
console.log(desiredList)
3 голосов
/ 08 июля 2019

Это должно быть просто filter на masterList:

masterList.filter(item => selectedList.includes(item.id));
2 голосов
/ 08 июля 2019

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

let masterList=[{id:1,name:'Abc'},{id:2,name:'Def'},{id:3,name:'Ghi'}];
let selectedList=[2,3];

const result = masterList.filter(({id})=> selectedList.includes(id));

console.log(result);
2 голосов
/ 08 июля 2019

Вы можете сначала преобразовать selectedList в Set, а затем использовать метод filter() массив объектов.

Вы можете использовать Set.prototype.has, чтобы проверить, существует ли id объектов в наборе или нет. И этот метод имеет O (1) сложность времени. Таким образом, временная сложность всего алгоритма будет линейной.

let masterList=[{id:1,name:'Abc'},{id:2,name:'Def'},{id:3,name:'Ghi'}];
let selectedList = [2,3];
let set = new Set(selectedList);

let res = masterList.filter(x => set.has(x.id));
console.log(res)
2 голосов
/ 08 июля 2019

Превратите первый массив в объект, индексированный сначала id, чтобы вы могли найти соответствующий соответствующий объект за O(1) время, а затем вы можете .map selectedList:

const masterList=[{id:1,name:'Abc'},{id:2,name:'Def'},{id:3,name:'Ghi'}];
const selectedList=[2,3];

const masterById = masterList.reduce((a, obj) => {
  a[obj.id] = obj;
  return a;
}, {});

const desiredList = selectedList.map(id => masterById[id]);
console.log(desiredList);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...