【问题标题】:什么可用于从 n 个集合中识别公共元素的源集合?
【发布时间】:2022-01-23 10:11:03
【问题描述】:

给定 n 个集合/数组,我想确定共同元素以及它们共同的集合。

这有点类似于this question,但在colletion1 和collection3 中可能有类似的元素,甚至所有这些元素。我不仅在所有集合中寻找相似的元素。此外,我愿意使用任何 Node.js 库。

var arr["One"] =   arrProps[{name: '1', prop2: 'aaa'}], arrValues['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'];
var arr["Two"] =   arrProps[{name: '2', prop2: 'bbb'}], arrValues['taco', 'fish', 'apple', 'pizza', 'car'];
var arr["Three"] = arrProps[{name: '3', prop2: 'ccc'}], arrValues['banana', 'pizza', 'fish', 'apple', 'orange', ];
var arr["Four"] =  arrProps[{name: '4', prop2: 'ddd'}], arrValues['grape', 'pear', 'chicken', 'car', 'orange'];

结果应该是:

[arrValue, arrProps.name]
apple: 1,2,3
banana: 1,3
pear: 1,4
fish: 1,2,3
taco:  1,2
pizza: 1,3
car: 2,4
orange: 3,4

如果将其表示为 JSON 图,而不是使用数组,会更容易解决吗?如果是,如何解决?

【问题讨论】:

    标签: javascript jquery node.js arrays


    【解决方案1】:

    一种'愚蠢'的解决方案:

    const arr = [
    { arrProps: [{name: '1', prop2: 'aaa'}], arrValues: ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'] },
    { arrProps: [{name: '2', prop2: 'bbb'}], arrValues: ['taco', 'fish', 'apple', 'pizza', 'car'] },
    { arrProps: [{name: '3', prop2: 'ccc'}], arrValues: ['banana', 'pizza', 'fish', 'apple', 'orange' ] },
    { arrProps: [{name: '4', prop2: 'ddd'}], arrValues: ['grape', 'pear', 'chicken', 'car', 'orange'] }
    ];
    
    const result = arr
      .flatMap(({ arrValues }) => arrValues )  // all values
      .filter((value, index, coll) => coll.indexOf(value) === index) //unique values
      .reduce((acc, value) => {
        const propName = arr
          .filter((obj) => obj.arrValues.includes(value))
          .map((obj) => obj.arrProps[0].name);
          
        acc[value] = (acc[value] ? [...acc[value], propName] : [propName])
          .join(',');
          
        return acc;
    }, {})
    
    console.log(result)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    更新

    我重新考虑了我的解决方法,并意识到它根本上是错误的。

    更新的解决方案:

    const arr = [
    { arrProps: [{name: '1', prop2: 'aaa'}], arrValues: ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'] },
    { arrProps: [{name: '2', prop2: 'bbb'}], arrValues: ['taco', 'fish', 'apple', 'pizza', 'car'] },
    { arrProps: [{name: '3', prop2: 'ccc'}], arrValues: ['banana', 'pizza', 'fish', 'apple', 'orange' ] },
    { arrProps: [{name: '4', prop2: 'ddd'}], arrValues: ['grape', 'pear', 'chicken', 'car', 'orange'] }
    ];
    
    const result = arr.reduce((acc, { arrProps: [{ name }], arrValues }) => {
        arrValues.forEach((value) => {
             acc[value] = acc[value] ? `${acc[value]},${name}`: name;
        });     
        return acc;
    }, {});
    
    console.log(result)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • @ElHaix 虽然我相信你的意图是光荣的,但试图“取消”其他人的投票会积极损害整个 Stack Overflow。人们不会提供拒绝投票的理由,因为他们这样做时会受到所有的骚扰,而且还因为 这不是必需的。反对票的箭头已经指明了反对票的原因。请不要那样做。两件错误的事情不会成为一件正确的事情。
    • @ElHaix 我重新考虑了我的解决方法,并意识到它根本上是错误的。添加了更新的解决方案。
    【解决方案2】:

    感谢@FFire 解决这个问题。

    我已经修改了代码,以便能够访问对象属性并将结果输出到各种表中以供查看。

    const arr = [
    { arrProps: [{name: '1', prop2: 'aaa'}], arrValues: ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'] },
    { arrProps: [{name: '2', prop2: 'bbb'}], arrValues: ['taco', 'fish', 'apple', 'pizza', 'car'] },
    { arrProps: [{ name: '3', prop2: 'ccc' }], arrValues: ['banana', 'pizza', 'fish', 'apple', 'orange'] },
    { arrProps: [{ name: '4', prop2: 'ddd' }], arrValues: ['grape', 'pear', 'chicken', 'car', 'orange'] },
    { arrProps: [{ name: '5', prop2: 'ddeeed' }], arrValues: ['blade', 'movie', 'apple', 'banana', 'lake'] }
    
    ];
    
    const result = arr
      .flatMap(({ arrValues }) => arrValues )  // all values
      .filter((value, index, coll) => coll.indexOf(value) === index) //unique values
      .reduce((acc, value) => {
        const parentProp = arr      // name, prop2, arrValues
          .filter((obj) => obj.arrValues.includes(value))
          .map((obj) => obj.arrProps[0]);
          
          //acc[value] = (acc[value] ? [...acc[value], parentProp] : [parentProp])
          //.join(',');
          acc[value] = parentProp
          
        return acc;
    }, {})
    
    
    console.log(result);
    
    
    Object.entries(result).forEach(([k, v]) => {
        //console.log("The pair: ", k)
        ////console.log("The value: ", v)
        //v.forEach(_parent => console.log(`
        //    Name: ${_parent.name}    
        //    Prop: {_parent.prop2}
        //`));
        console.log(`      ----] The value '${k}' exists in:`);
        console.table(v);
    })
    
    console.table(result);
    
    //result["apple"].forEach(e => console.log(e.name));
    
    console.log(JSON.stringify(result));

    当然,像所有解决方案一样,可能有更有效的方法来执行此操作。欢迎更多回复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多