Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript比较数组以标记特定元素的出现_Javascript_Arrays_Algorithm - Fatal编程技术网

Javascript比较数组以标记特定元素的出现

Javascript比较数组以标记特定元素的出现,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我有一个数组,它包含n数组,这些数组保存汽车信息(color,company),如下所示: el[0]->颜色值 el[1]->公司价值 我的目标是向多少汽车公司展示一种颜色 例如,这个数组 var array = [ ['red', 'Ford'], ['blue', 'Ford'], ['green', 'Ford'], ['red', 'Ford'], ['red', 'Renault'], ['blue', 'Renault'], ['green', 'Ope

我有一个数组,它包含
n
数组,这些数组保存汽车信息(
color
company
),如下所示:
el[0]
->颜色值
el[1]
->公司价值

我的目标是向多少汽车公司展示一种颜色

例如,这个数组

var array = [
  ['red', 'Ford'],
  ['blue', 'Ford'],
  ['green', 'Ford'],
  ['red', 'Ford'],
  ['red', 'Renault'],
  ['blue', 'Renault'],
  ['green', 'Opel'],
  ['red', 'Opel']
];
应更改如下:

 result = [
  ['red', 'Ford', '3: Ford, Renault, Opel'],
  ['blue', 'Ford', '2: Ford, Renault'],
  ['green', 'Ford', '2: Ford, Open'],
  ['red', 'Renault', '3: Ford, Renault, Opel'],
  ['blue', 'Renault', '2: Ford, Renault'],
  ['green', 'Opel', '2: Ford, Opel'],
  ['red', 'Opel', '3: Ford, Renault, Opel']
 ];
说明:
3家
公司拥有
红色
颜色:
福特、雷诺、欧宝

2家
公司拥有
蓝色
颜色:
福特、雷诺

2家
公司拥有
绿色
颜色:
福特、欧宝

这就是我认为可以解决的方法,但我不确定这是否是正确的方法:
1.循环遍历每个数组并过滤颜色,以获得所有应用于该数组的公司
2.循环过滤响应并删除重复项

3.再次循环主数组,并将步骤2的结果分配给具有过滤颜色的对应数组。您可以这样处理:

var数组=[
[‘红色’、‘福特’],
[‘蓝色’、‘福特’],
[‘绿色’、‘福特’],
[‘红色’、‘福特’],
[‘红色’、‘雷诺’],
[“蓝色”、“雷诺”],
[‘绿色’、‘欧宝’],
[‘红色’、‘欧宝’]
];
//存储计算的计数
var cache={};
var result=array.map(项=>{
变量键=项目[0];
//仅当在缓存中找不到该项时才执行处理
如果(!缓存[key]){
var模型=数组
//得到所有相同颜色的物品
.filter(项目1=>{
返回item1[0]==键;
})
//获取模型列表
.map(项1=>{
返回项目1[1];
})
//仅提取唯一值
.filter((项1,i,arr)=>{
返回arr.indexOf(item1)==i;
});
//将计算放在缓存中
如果(!缓存[key]){
cache[key]=“${models.length}:${models.join(',')}”;
}
}
//将结果附加到原始项中
item.push(缓存[键]);
退货项目;
});

控制台日志(结果)您可以构建一个类似于关联数组的对象,在其中按颜色存储汽车列表。然后,可以通过使用类似于关联阵列的对象更改原始阵列的元素来映射原始阵列:

var数组=[
[‘红色’、‘福特’],
[‘蓝色’、‘福特’],
[‘绿色’、‘福特’],
[‘红色’、‘福特’],
[‘红色’、‘雷诺’],
[“蓝色”、“雷诺”],
[‘绿色’、‘欧宝’],
[‘红色’、‘欧宝’]
];
var map=array.reduce((映射,行)=>{
映射[行[0]]=映射[行[0]]| |[];
如果(!映射[第[0]行])。包括(第[1]行){
映射[行[0]]。推送(行[1]);
}
返回图;
}, {});
var result=array.map(row=>(row.push(`${map[row[0]]].length}:${map[row[0]].join(',')}`),row));

控制台日志(结果)可以采用双循环方法,使用哈希表收集数组的第二个元素

var数组=[[red'、[Ford']、[blue'、[Ford']、[green'、[Ford']、[red'、[Ford']、[red'、[Renault']、[blue'、[Renault']、[green'、[Opel']、[red'、[Opel'],
hash=Object.create(null);
array.forEach(函数(a){
hash[a[0]]=hash[a[0]]| |{};
散列[a[0]][a[1]]=true;
});
forEach(函数(a,i,aa){
var keys=Object.keys(散列[a[0]]);
aa[i][2]=keys.length+':'+keys.join(',');
});
console.log(数组)
.as控制台包装{最大高度:100%!重要;顶部:0;}
var数组=[
[‘红色’、‘福特’],
[‘蓝色’、‘福特’],
[‘绿色’、‘福特’],
[‘红色’、‘福特’],
[‘红色’、‘雷诺’],
[“蓝色”、“雷诺”],
[‘绿色’、‘欧宝’],
[‘红色’、‘欧宝’]
];
const res=array.map(set=>{
const newSet=set;
常量same=array.filter(compareSet=>set[0]==compareSet[0])
.map(compareSet=>compareSet[1])
.filter((make,i,arr)=>arr.indexOf(make)==i);
push(`${same.length}${same.join(',')}`);
返回新闻集;
});

document.body.innerHTML=JSON.stringify(res).split('],[').join('],
[');
您是如何解决这个问题的?您有简单的英语算法吗?@Learnonhardway我已经更新了我的问题