Javascript Jquery检查一个数组是否包含相同的值

Javascript Jquery检查一个数组是否包含相同的值,javascript,jquery,Javascript,Jquery,我有一个简单的javascript数组,它可能包含重复项,也可能不包含重复项 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/te

我有一个简单的javascript数组,它可能包含重复项,也可能不包含重复项

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'],
];
我需要找到重复的文件路径并将它们的名称放入新数组中。如果没有重复项,则首先在中分配其名称,然后在两个值后分配“”。我可以指出我尝试过的所有代码,但它不起作用。我也接受jquery解决方案。预期的结果是这样的

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'],
];
我试过的是这个

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);
}
for(变量i=0;i
您可以获取一个哈希表和一个空字符串数组,然后为该值找到下一个插槽

通过将一个对象作为累加器,将一个解构数组作为值(数组的第一部分)和键(第二部分,也称为filepath),来减少数组

在的内部,使用键进行属性检查,如果未定义,则通过使用指定键指定具有所需结构的数组(包含两项的数组,第一项是包含三个emty空格和键的数组)

下一行将值分配给下一个空闲插槽,该插槽是一个空字符串项

最后,累加器返回

要仅获取一个数组作为结果,需要对对象的值进行转换

let names=['aaa'、'pin/test1.html']、['bbb'、'pin/test2.html']、['ttt'、'test.html']、['ggg'、'test.html']、['yyyy'、'un/777.html']、['ggg'、'test3.html']、['nnn'、'test3.html']、['eee'、'n/777.html']、'n/777.html']、['sss'、'pin/test1.html']、['xxx'、'pin/test2.html'],
分组=对象.值(名称.减少((r,[v,k])=>{
r[k]??=[数组(3).填充(''),k];
r[k][0][r[k][0].indexOf('')=v;
返回r;
}, {}));
控制台日志(分组)
.as控制台包装{最大高度:100%!重要;顶部:0;}
const aux=(名称)=>{
常量哈希={};
设max=0;
name.forEach(ele=>{
如果(!hash[ele[1]])hash[ele[1]]=[];
哈希[ele[1]].push(ele[0]);
max=Math.max(散列[ele[1]].length,max);
});
返回Object.keys(hash).map(ele=>[[…hash[ele],…数组(max-hash[ele].length).fill(“”),ele]);
}
变量名称=[
['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))
处理常规JS结构不需要jQuery,只需以下简单代码即可实现:

var name=['aaa'、'pin/test1.html']、['bbb'、'pin/test2.html']、['ttt'、'test.html']、['ggg'、'test.html']、['yyyy'、'un/777.html']、['ggg'、'test3.html']、['nnn'、'test3.html']、['eee'、'n/777.html']、'n/777.html']、['sss'、'pin/test1.html']、['xxx'、'pin/test2.html']、testppp'];
设lengthToFill=0;
//将所有重复项收集到地图中
常量路径映射={};
name.forEach(name=>{
//以防万一,如果您不熟悉阵列分解
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
常量[路径名,路径]=名称;
//确保我们有一个数组要处理
//以防您不熟悉空聚结运算符(??)
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
路径映射[路径]=路径映射[路径]??[];
路径映射[path].push(路径名);
//跟踪我们添加到单个条目中的最大元素数
lengthToFill=Math.max(lengthToFill,路径映射[path].length);
});
const result=Object.entries(路径映射).map(条目=>{
//根据我们目前收集的数据构造新的数组条目
返回[
条目[1].concat(数组(lengthToFill-entry[1].length).fill(“”)),
条目[0],
];
});

控制台日志(结果)你从哪里得到的
'ppp'
啊!很抱歉已编辑代码。是否也接受将结果放在“普通”对象而不是数组中?然后您可以使用文件路径作为键,只需将结果推送到该键后面的数组中。