как заказать аранжировки из условия javascript? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть структура, в которой количество расположений может варьироваться:

array1 = [
{local: {id: 1, name: 'local1'}},
{local: {id: 2, name: 'local2'}},
{local: {id: 3, name: 'local3'}},
{local: {id: 4, name: 'local4'}},
{local: {id: 5, name: 'local5'}}
];

array2 = [
{local: {id: 1, name: 'local1'}},
{local: {id: 3, name: 'local3'}},
{local: {id: 3, name: 'local4'}},
{local: {id: 3, name: 'local5'}},
];

array3 = [
{local: {id: 1, name: 'local1'}},
{local: {id: 3, name: 'local2'}},
{local: {id: 3, name: 'local3'}},
{local: {id: 3, name: 'local5'}},
];

Мне нужно создать новый массив из них, в котором этот новый массив сначала упорядочивается по идентификаторам, которые повторяются в все массивы, а затем и те, которые не повторяются, должны быть примерно такими:

newArray = [
    {local: {id: 1, name: 'local1'}},
    {local: {id: 3, name: 'local3'}},
    {local: {id: 5, name: 'local5'}},
    {local: {id: 2, name: 'local2'}},
    {local: {id: 4, name: 'local4'}}
  ]

Кто-нибудь, кто может мне помочь, пожалуйста !!

Ответы [ 3 ]

0 голосов
/ 20 июня 2020

Я бы так сделал (может быть, не оптимальное решение):

/* Same Arrays as yours */ const array1=[{local:{id:1,name:"local1"}},{local:{id:2,name:"local2"}},{local:{id:3,name:"local3"}},{local:{id:4,name:"local4"}},{local:{id:5,name:"local5"}}],array2=[{local:{id:1,name:"local1"}},{local:{id:3,name:"local3"}},{local:{id:3,name:"local4"}},{local:{id:3,name:"local5"}}],array3=[{local:{id:1,name:"local1"}},{local:{id:3,name:"local2"}},{local:{id:3,name:"local3"}},{local:{id:3,name:"local5"}}];

function myFunc(arrays) {
  // All items, with duplicates
  const allItems = [].concat.apply([], arrays);
  // All IDs, without duplicates thanks to `Set`
  const allIDs = Array.from(
    allItems.reduce((set, item) => set.add(item.local.id), new Set())
  );
  
  // Helper function used for sorting
  const isInAllArrays = id => arrays.every(
    arr => arr.some(item => item.local.id === id)
  );
  // Sort the IDs based on whether they are in all arrays or not
  allIDs.sort((a, b) => {
    const _a = isInAllArrays(a), _b = isInAllArrays(b);
    if (_a !== _b) return _a ? -1 : 1;
    return 0;
  });
  // Map all IDs to the first element with this ID
  return allIDs.map(id => allItems.find(item => item.local.id === id));
}

const newArray = myFunc([array1, array2, array3]);

// Just for readability in the demo below
console.log(JSON.stringify(newArray).split('},{').join('},\n{'));
0 голосов
/ 20 июня 2020

1) Обходите все массивы и создайте объект с ключами, такими как id, и значением, включающим объект, а также сохраните частоту появления (счетчик). 2) Теперь, Object.values вышеуказанного объекта и отсортируйте их по «счетчику». Сверху вы получите наиболее часто встречающиеся предметы.

const sort = (...arrs) => {
  const all = {};
  arrs
    .flat()
    .forEach(
      (obj) =>
        (all[obj.local.id] =
          obj.local.id in all
            ? { ...all[obj.local.id], count: all[obj.local.id].count + 1 }
            : { ...obj, count: 1 })
    );
  return Object.values(all)
    .sort((a, b) => b.count - a.count)
    .map(({ count, ...rest }) => rest);
};

array1 = [
  { local: { id: 1, name: "local1" } },
  { local: { id: 2, name: "local2" } },
  { local: { id: 3, name: "local3" } },
  { local: { id: 4, name: "local4" } },
  { local: { id: 5, name: "local5" } },
];

array2 = [
  { local: { id: 1, name: "local1" } },
  { local: { id: 3, name: "local3" } },
  { local: { id: 3, name: "local4" } },
  { local: { id: 3, name: "local5" } },
];

array3 = [
  { local: { id: 1, name: "local1" } },
  { local: { id: 3, name: "local2" } },
  { local: { id: 3, name: "local3" } },
  { local: { id: 3, name: "local5" } },
];


console.log(sort(array1, array2, array3))
0 голосов
/ 20 июня 2020

Преобразование всех массивов в объекты для быстрого поиска.

const array1 = [{
    local: {
      id: 1,
      name: 'local1'
    }
  },
  {
    local: {
      id: 2,
      name: 'local2'
    }
  },
  {
    local: {
      id: 3,
      name: 'local3'
    }
  },
  {
    local: {
      id: 4,
      name: 'local4'
    }
  },
  {
    local: {
      id: 5,
      name: 'local5'
    }
  }
];

const array2 = [{
    local: {
      id: 1,
      name: 'local1'
    }
  },
  {
    local: {
      id: 3,
      name: 'local3'
    }
  },
  {
    local: {
      id: 3,
      name: 'local4'
    }
  },
  {
    local: {
      id: 3,
      name: 'local5'
    }
  },
];

const array3 = [{
    local: {
      id: 1,
      name: 'local1'
    }
  },
  {
    local: {
      id: 3,
      name: 'local2'
    }
  },
  {
    local: {
      id: 3,
      name: 'local3'
    }
  },
  {
    local: {
      id: 3,
      name: 'local5'
    }
  },
];

const obj1 = array1.reduce((acc, item) => {
  acc[item.local.id] = item;
  return acc;
}, {});

const obj2 = array2.reduce((acc, item) => {
  acc[item.local.id] = item;
  return acc;
}, {});


const obj3 = array3.reduce((acc, item) => {
  acc[item.local.id] = item;
  return acc;
}, {});

const result = {
  ...obj3,
  ...obj2,
  ...obj1
};

const output = [];
const temp = [];

for (let key in result) {
  if (obj1[key] && obj2[key] && obj3[key]) {
    output.push(result[key]);
  } else temp.push(result[key]);
}

console.log([...output, ...temp]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...