我有一个包含 n
个数组,其中包含汽车信息(color
、company
),如下所示:
el[0]
-> 颜色值
el[1]
-> 公司值(value)
我的目标是显示可以找到多少家汽车公司的颜色。
例如这个数组
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 array = [
['red', 'Ford'],
['blue', 'Ford'],
['green', 'Ford'],
['red', 'Ford'],
['red', 'Renault'],
['blue', 'Renault'],
['green', 'Opel'],
['red', 'Opel']
];
// To store calculated counts
var cache = {};
var result = array.map(item => {
var key = item[0];
// Do processing only if the item isn't found in cache
if (!cache[key]) {
var models = array
// Get all the same colored items
.filter(item1 => {
return item1[0] === key;
})
// Get the list of models
.map(item1 => {
return item1[1];
})
// Extract only the unique values
.filter((item1, i, arr) => {
return arr.indexOf(item1) === i;
});
// Put the calculation in cache
if (!cache[key]) {
cache[key] = `${models.length}: ${models.join(', ')}`;
}
}
// Append the result into original item
item.push(cache[key]);
return item;
});
console.log(result);
我使用了中间对象缓存
来节省一些处理时间,因为必须对一种颜色执行多次相同的操作。
关于JavaScript 比较数组来标记特定元素的出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47713526/