сравнить два массива объектов и отсортировать по одному массиву объектов и pu sh, если не совпадает - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть два массива в javascript

array1 = [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}]
array2 = [
         [{id: 5, value:'abc'}, {id: 4, value:'xyz'}],
         [{id: 5, value:'abc'}, {id: 2, value:'pqr'}],
         [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}],
         [{id: 2, value:'pqr'}, {id: 5, value:'abc'}]
]

array2 - массив массивов объектов, все эти массивы в массиве 2 должны быть сначала отсортированы в соответствии с последовательностью array1, а затем объект с нулевым следует нажать, если этот конкретный идентификатор не существует в этом конкретном индексе.

output = [
         [{id: 4, value:'xyz'}, {id: null, value:null}, {id: 5, value:'abc'}],
         [{id: null, value:null}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}],
         [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: null, value:null}],
         [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: null, value:null}],
         [{id: null, value:null}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}]
].

Вот мой код

export const mapOrder = (array, order, key) => {
    let arr = [];
    array.sort((a, b) => {
        let A = a[key];
        let B = b[key];
        if (order.indexOf(A) > order.indexOf(B)) {
            return 1;
        }
        return -1;
    });
    if (order.length > 0) {
        for (let i = 0; i < order.length; i++) {
            for (let j = 0; j < array.length; j++) {
                if (order[i] === array[j].UserId) {
                    arr.push(array[j]);
                } else {
                    arr.push({ id: null, value: null})
                }
            }
        }
        array = arr;
    }
    return arr;
};

Ответы [ 3 ]

0 голосов
/ 13 апреля 2020

Вы можете создать карту из вашего массива 2, где каждый идентификатор из объектов в массиве 2 указывает на массив объектов с этим конкретным значением id. Затем вы можете использовать .flatMap() на array1 и получить все объекты для id текущего итерированного объекта, используя .get() на вашей карте. Если .get() ничего не возвращает, вы можете предоставить объект по умолчанию (где id и значение null):

const array1 = [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}];
const array2 = [{id: 5, value:'abc'}, {id: 4, value:'xyz'}];

// group the arrays into a Map
const grouped = array2.reduce((map, obj) => 
  map.set(obj.id, (map.get(obj.id) || []).concat(obj)),
  new Map
);

const res = array1.flatMap(({id}) => grouped.get(id) || ({id: null, value: null}));
console.log(res);

Вы можете удалить .flatMap() и необходимость массива объектов в вашем Map, если объекты в массиве 2 имеют уникальные значения id (ie: объект с такой же идеей не может существовать). Если это так, вы можете упростить вышесказанное:

const array1 = [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}];
const array2 = [{id: 5, value:'abc'}, {id: 4, value:'xyz'}];

const ids = new Map(array2.map((obj) => [obj.id, obj]));
const res = array1.map(({id}) => ids.get(id) || ({id: null, value: null}));
console.log(res);
0 голосов
/ 13 апреля 2020

Вы можете сначала собрать объект в объекте, а затем отобразить собранные объекты или взять заполнитель.

var array1 = [{ id: 4, value: 'xyz' }, { id: 2, value: 'pqr' }, { id: 5, value: 'abc' }],
    array2 = [{ id: 5, value: 'abc' }, { id: 4, value: 'xyz' }],
    result = array1.map(
        (o => ({ id }) => o[id] || { id: null, value: null })
        (array2.reduce((r, o) => ({ ...r, [o.id]: o }), {}))
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 13 апреля 2020

Сначала вы можете l oop над вторым массивом и сохранить идентификаторы в новом наборе, затем l oop над первым массивом и, если идентификатор текущего элемента присутствует в наборе, вернуть текущий объект или вернуть объект с id и значением как ноль`

const array1 = [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}]
const array2 = [{id: 5, value:'abc'}, {id: 4, value:'xyz'}]

function test(arr1, arr2) {
  const set = new Set()
  arr2.forEach(i => set.add(i.id))
  return arr1.map((i) => set.has(i.id) ? i : { id: null, value: null })
}
console.log(test(array1,array2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...