我遇到了这个问题,但没有解决。
在此数组数组中,当对象中的两个或多个颜色键与该数组的任何其他对象颜色键集匹配时,我想为每个数组对象添加一个名为match
的布尔键,不管每个键是否匹配。
例如,data[0][0]
和data[0][1]
数组中的两个对象共享密钥color
white
和black
,因此是{{1} } match: true
和data[0][0]
中的所有对象,但没有data[0][1]
中的所有对象,因为它只有一个,因此将是data[0][2]
。
结果如下:
match: false
这是一个小样本。实际数据有数百个数组,并且匹配项至少应为7
答案 0 :(得分:1)
您可以将colors
的交集作为一个数组,并将length
与您的预期阈值进行比较,以确定结果中的match
的值。
function match (data, key, filter, transform) {
const arrays = data.map(
array => array.map(key)
);
const groups = arrays.map(
array => ({ array, set: new Set(array) })
);
const matches = groups.map(
outer => groups.some(
inner => (
outer !== inner &&
filter(outer.array.filter(inner.set.has, inner.set))
)
)
);
return data.map(
(array, index) => transform(array, matches[index])
);
}
const data = [[{name:'car',color:'black',group:0},{name:'car',color:'white',group:0},{name:'car',color:'blue',group:0}],[{name:'truck',color:'black',group:1},{name:'truck',color:'white',group:1},{name:'truck',color:'yellow',group:1}],[{name:'moto',color:'black',group:2},{name:'moto',color:'pink',group:2},{name:'moto',color:'orange',group:2}]];
const result = match(
data,
value => value.color,
keys => keys.length >= 2,
(array, match) => array.map(
value => Object.assign(value, { match })
)
);
console.log(result);
这会为colors
的每个数组创建一个Set()
,以便更高效地计算每次通过时的交点,而不会重复(如果有)。
对于实际数据,您可以将filter
参数更改为
colors => colors.length >= 7
答案 1 :(得分:0)
您可以用黑白数字计数,并使用match
获取新对象。
var data = [[{ name: 'car', color: 'black', group: 0 }, { name: 'car', color: 'white', group: 0 }, { name: 'car', color: 'blue', group: 0 }], [{ name: 'truck', color: 'black', group: 1 }, { name: 'truck', color: 'white', group: 1 }, { name: 'truck', color: 'yellow', group: 1 }], [{ name: 'moto', color: 'black', group: 2 }, { name: 'moto', color: 'pink', group: 2 }, { name: 'moto', color: 'orange', group: 2 }]],
result = data.map(a => {
var count = {},
match = a.some(({ color }) => {
count[color] = (count[color] || 0) + 1;
return count.black === 1 && count.white === 1;
});
return a.map(o => Object.assign({}, o, { match }));
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }