0
votes

Comment commander des arrangements basés sur une condition en JavaScript?

J'ai une structure dans laquelle le nombre d'arrangements peut varier: xxx pré>

J'ai besoin de créer un nouveau tableau à partir de ceux-ci, dans lequel ce nouveau tableau est commandé en premier par les ID qui sont répété dans tous les tableaux, puis ceux qui ne sont pas répétés, devraient être quelque chose comme ceci: P>

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 commentaires

Pour le boîtier d'identification répété, quel élément de tous les tableaux que vous attendez d'être poussé dans la matrice de résultat.


La valeur du nom serait-elle la même pour tous les identifiants similaires?


Qu'est-ce que tu as essayé jusque-là? Avez-vous recherché votre problème? Je ne vois aucune tentative de code dans votre question. Bien que nous soyons tous impatients d'aider, il est également important de noter que le débordement de la pile n'est pas un service de codage. S'il vous plaît, montre-nous ce que vous avez essayé jusqu'à présent afin que nous puissions vous noter dans la bonne direction.


3 Réponses :


0
votes

convertir tous les matrices en objets pour une recherche rapide.

p>

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]);


0 commentaires

0
votes

Je le ferais comme ceci (peut ne pas être la solution optimale):

p>

/* 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 commentaires

0
votes

1) Traverser tous les tableaux et construire un objet avec des touches telles que ID code> et la valeur incluent l'objet et maintenez également la fréquence de l'occurrence (compte). 2) Maintenant, objet.values ​​ code> de l'objet ci-dessus et triez-les basé sur "Compte". Vous obtiendrez les articles les plus fréquents en haut.

p>

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 commentaires