J'ai un tableau javascript simple qui peut contenir des doublons ou ne pas contenir de doublons.
for (var i = 0; i < arr.length; i++) {
var uniqueNames = [];
$.each(arr[i], function (i, el) {
if ($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});
console.log(uniqueNames);
}
Je dois trouver le chemin de fichier en double et mettre leur nom dans un nouveau tableau. S'il n'y a pas de doublon, attribuez son nom en premier, puis attribuez «» après deux valeurs. Je pourrais pointer tous les codes que j'ai essayés mais cela ne fonctionne pas. J'accepte également la solution jquery. Le résultat attendu est le suivant.
var outcome = [ [['aaa','sss','ppp'], 'pin/test1.html'], [['bbb','eee','xxx'], 'pin/test2.html'], [['ttt','ggg',''], 'test.html'], [['yyy','',''], 'un/777.html'], [['ggg','nnn',''], 'test3.html'], ];
Ce que j'ai essayé, c'est ceci
var names = [ ['aaa','pin/test1.html'], ['bbb','pin/test2.html'], ['ttt','test.html'], ['ggg','test.html'], ['yyy','un/777.html'], ['ggg','test3.html'], ['nnn','test3.html'], ['eee','n/777.html'], ['sss','pin/test1.html'], ['xxx','pin/test2.html'], ['ppp','pin/test1.html'], ];
3 Réponses :
Vous pouvez prendre une table de hachage et un tableau de chaînes vides et trouver l'emplacement suivant pour la valeur.
Le tableau est réduit en prenant un objet comme accumulateur et un tableau de destructure comme valeur (la première partie du tableau) et clé (la deuxième partie, aka filepath).
A l' intérieur de Array#reduce , une vérification de la propriété avec la clé est faite et si non défini, un tableau avec la structure désirée (tableau avec deux éléments, le premier est un tableau avec trois espaces emty et la clé) est attribuée à l'aide d' une logique affectation nulle ??= .
La ligne suivante attribue la valeur au prochain emplacement libre, un élément avec une chaîne vide.
Enfin l'accumulateur est renvoyé.
Pour obtenir uniquement un tableau comme résultat, une conversion des valeurs de l'objet a lieu.
.as-console-wrapper { max-height: 100% !important; top: 0; }let names = [['aaa','pin/test1.html'], ['bbb','pin/test2.html'], ['ttt','test.html'], ['ggg','test.html'], ['yyy','un/777.html'], ['ggg','test3.html'], ['nnn','test3.html'], ['eee','n/777.html'], ['sss','pin/test1.html'], ['xxx','pin/test2.html'], ['ppp','pin/test1.html']],
grouped = Object.values(names.reduce((r, [v, k]) => {
r[k] ??= [Array(3).fill(''), k];
r[k][0][r[k][0].indexOf('')] = v;
return r;
}, {}));
console.log(grouped); const aux = (names) => {
const hash = {};
let max = 0;
names.forEach(ele => {
if (!hash[ele[1]]) hash[ele[1]] = [];
hash[ele[1]].push(ele[0]);
max = Math.max(hash[ele[1]].length, max);
});
return Object.keys(hash).map(ele => [[...hash[ele], ...Array(max -hash[ele].length).fill("")], ele]);
}
var names = [
['aaa','pin/test1.html'],
['bbb','pin/test2.html'],
['ttt','test.html'],
['ggg','test.html'],
['yyy','un/777.html'],
['ggg','test3.html'],
['nnn','test3.html'],
['eee','n/777.html'],
['sss','pin/test1.html'],
['xxx','pin/test2.html'],
['ppp','pin/test1.html'],
];
console.log(aux(names))Cela pourrait aider
Vous n'avez pas besoin de jQuery pour gérer la structure JS standard, vous pouvez réaliser ce que vous voulez avec un code simple comme celui-ci:
var names = [['aaa','pin/test1.html'],['bbb','pin/test2.html'],['ttt','test.html'],['ggg','test.html'],['yyy','un/777.html'],['ggg','test3.html'],['nnn','test3.html'],['eee','n/777.html'],['sss','pin/test1.html'],['xxx','pin/test2.html'],['ppp','pin/test1.html'],];
let lengthToFill = 0;
// collecting all the duplicates into a map
const pathMap = {};
names.forEach(name => {
// just in case if you're not familiar with array destructuring
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
const [pathName, path] = name;
// make sure we have an array to deal with
// just in case you're not familiar with Nullish coalescing operator (??)
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
pathMap[path] = pathMap[path] ?? [];
pathMap[path].push(pathName);
// tracking the max number of elements we're adding into a single entry
lengthToFill = Math.max(lengthToFill, pathMap[path].length);
});
const result = Object.entries(pathMap).map(entry => {
// constructing new array entry based on the data we've collected so far
return [
entry[1].concat(Array(lengthToFill - entry[1].length).fill('')),
entry[0],
];
});
console.log(result);Cette solution fonctionnera pour n'importe quel nombre d'éléments avec lesquels vous souhaitez remplir le tableau avec «». Il s'assure que la longueur de la liste finale est la même pour toutes les entrées.
D'où obtenez-vous
'ppp'?Oh! Pardon. modifiez déjà le code.
Est-il également accepté de placer les résultats dans un objet "normal" au lieu d'un tableau? Ensuite, vous pouvez utiliser le chemin du fichier comme clé et simplement pousser les résultats dans le tableau derrière cette clé.