【问题标题】:Get the unique value from 3 or more arrays [duplicate]从3个或更多数组中获取唯一值[重复]
【发布时间】:2021-05-14 01:11:15
【问题描述】:

在这种情况下,我在 javascript 中有 3 个数组:

var array1 = ['124','10','100','190','1000'];
var array2 = ['124','100','190', '45'];
var array3 = ['124','100','175','19','1900'];

我需要一个从 3 个或更多数组(在本例中为 3 个数组)中获取唯一值的脚本。结果应该是:

['10','1000','45','175','19','1900']

感谢您的帮助

【问题讨论】:

标签: javascript arrays filter


【解决方案1】:

您可以使用 Map 并将已知键设置为 false,反之亦然。

然后映射映射,过滤并仅映射键。

分段:

  • spread syntax ... 的数组中的所有值创建一个数组。
  • 使用 Map 减少数组并将未见值设置为 true 并将已见值设置为 false。结果是一个将所有值作为键和值作为truefalse 的映射,具体取决于唯一性与否。
  • 通过映射,您只需获取值为true 的键。这需要地图中的数组。
  • 过滤数组以仅获取唯一键。
  • 映射数组以仅获取键。

结果是一个具有唯一值的数组。

const
    a = ['124', '10', '100', '190', '1000'],
    b = ['124', '100', '190', '45'],
    c = ['124', '100', '175', '19', '1900'],
    unique = Array
        .from([...a, ...b, ...c].reduce((m, v) => m.set(v, !m.has(v)), new Map))
        .filter(([, b]) => b)
        .map(([v]) => v);

console.log(unique);

【讨论】:

  • 这是一个优雅的设置,但不适合胆小的人?初学者将难以逐步理解,也许您可​​以为他们详细说明??
【解决方案2】:

这是解决这个问题的非常优雅的方法。它甚至在同一个数组中查找全局唯一值。

var array1 = ['124','10','100','190','1000'];
var array2 = ['124','100','190', '45'];
var array3 = ['124','100','175','19','1900'];

function getUniqueValues(...arrays) {
    const concatetedArray = arrays.flat();
  
    return arrays.reduce((accumulator, current) => {
      return [...accumulator, ...current.filter((currentItem) => concatetedArray.indexOf(currentItem) === concatetedArray.lastIndexOf(currentItem))];
    }, [])
  }

console.log(getUniqueValues(array1, array2, array3));

【讨论】:

    【解决方案3】:

    解决方案是使用这样的对象:

    var array1 = ['124', '10', '100', '190', '1000'];
    var array2 = ['124', '100', '190', '45'];
    var array3 = ['124', '100', '175', '19', '1900'];
    
    const obj = {};
    for (let i = 0; i < array1.length; i++) {
      if (!obj[array1[i]]) {
        obj[array1[i]] = 0;
      }
      obj[array1[i]]++;
    }
    
    for (let i = 0; i < array2.length; i++) {
      if (!obj[array2[i]]) {
        obj[array2[i]] = 0;
      }
      obj[array2[i]]++;
    }
    
    for (let i = 0; i < array3.length; i++) {
      if (!obj[array3[i]]) {
        obj[array3[i]] = 0;
      }
      obj[array3[i]]++;
    }
    const uniques = [];
    Object.keys(obj).forEach(key => {
      if (obj[key] == 1) {
        uniques.push(key);
      }
    })
    console.log(uniques);

    【讨论】:

    • 当你在代码中重复自己...看看你是否可以创建一个函数并重新使用它——永远记住DRY
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2012-06-30
    • 2013-04-01
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多