给定对象键的匹配条件,将键添加到数组集合内的对象集

时间:2019-07-04 14:51:36

标签: javascript arrays object

我遇到了这个问题,但没有解决。

在此数组数组中,当对象中的两个或多个颜色键与该数组的任何其他对象颜色键集匹配时,我想为每个数组对象添加一个名为match的布尔键,不管每个键是否匹配。

例如,data[0][0]data[0][1]数组中的两个对象共享密钥color whiteblack,因此是{{1} } match: truedata[0][0]中的所有对象,但没有data[0][1]中的所有对象,因为它只有一个,因此将是data[0][2]

结果如下:

match: false

这是一个小样本。实际数据有数百个数组,并且匹配项至少应为7

2 个答案:

答案 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; }