【问题标题】:Comparing two arrays and getting out missing/wrong items比较两个数组并找出丢失/错误的项目
【发布时间】:2020-02-10 07:23:24
【问题描述】:

我对 Js 数组没什么问题。我有两个数组 - 一个始终正确(使用正确的数据创建),一个基本上来自获取。我正在尝试比较这两个数组,我能够得到它们匹配的项目,但不能得到不匹配的项目:

    var results = [];
    var controlArray = ['T', 'M', 'P', 'N']
    var fetchArray = ['T', 'M', 'PP', 'N ']

    for (var i = 0; i < controlArray.length; i++) {
        for (var j = 0; j < fetchArray.length; j++) {
            if (controlArray[i] === fetchArray[j]) {
                results.push(fetchArray[i]);
            }
        }         
    }

输出应该是这样的:

    results = ['PP', 'N '];

或:

    results = ['P', 'N'];

所以它会指出问题出在哪里。这两种方法都有效。

这给了我匹配的部分。我试图只放 !== 但在那种情况下,它基本上会多次抛出所有东西,我看不出逻辑为什么它不应该那样工作。空白也很重要。

有什么想法可以轻松地从这些数组中取出不匹配的值吗?

【问题讨论】:

  • 你能分享你数组中数据的sn-p吗?
  • 请添加想要的结果。数组是排序的还是你只需要缺少的或共同的部分?
  • 你可以试试:results = controlArray.filter(e =&gt; !fetchArray.includes(e))
  • 你想将第一个项目与第一个匹配等等吗?

标签: javascript


【解决方案1】:

它返回的原因是你将一个数组的元素与另一个数组的所有其他元素进行比较。

var results = [];
var controlArray = ['T', 'M', 'P', 'N']
var fetchArray = ['T', 'M', 'PP', 'N ']

for (var i = 0; i < controlArray.length; i++) {
    for (var j = 0; j < fetchArray.length; j++) {
        if (controlArray[i] === fetchArray[j]) {
            results.push(fetchArray[i]);
        }
    }         
}

您应该只使用一个索引来比较两个数组。

    var results = [];
    var controlArray = ['T', 'M', 'P', 'N']
    var fetchArray = ['T', 'M', 'PP', 'N ']

    for (var i = 0; i < controlArray.length; i++) {
        if (controlArray[i] !== fetchArray[i]) {
            results.push(fetchArray[i]);
        }       
    }
    console.log(results)

【讨论】:

    【解决方案2】:

    您应该遍历一个数组并使用包含进行过滤。例如:

    const results = fetchArray.filter(el => !controlArray.includes(el));
    // results: ['PP', 'N ']
    

    希望对你有帮助..

    【讨论】:

      【解决方案3】:

      来自 fetchArray 但不在 controlArray 中的项目

      fetchArray.forEach(function(it){
          controlArray.indexOf(it)==-1&&results.push(it)
      })// results: ['PP', 'N ']
      

      来自 controlArray 但不在 fetchArray 中的项目

      controlArray.forEach(function(it){
          fetchArray.indexOf(it)==-1&&results.push(it)
      })// results: ['P', 'N']
      

      【讨论】:

        【解决方案4】:

        您可以只使用filterfind 匹配和不匹配的元素。

        const controlArray = ['T', 'M', 'P', 'N'];
        const fetchArray = ['T', 'M', 'PP', 'N '];
        
        const match = fetchArray.filter(value => !!controlArray.find(controlValue => value === controlValue))
        
        const noMatch = fetchArray.filter(value => !controlArray.find(controlValue => value === controlValue));
        
        console.log({
          match,
          noMatch
        })

        【讨论】:

          【解决方案5】:

          您可以创建一个Set 以更快地访问和过滤Set#has

          为了从controlArray 获取值,请切换数组。

          var controlArray = ['T', 'M', 'P', 'N'],
              fetchArray = ['T', 'M', 'PP', 'N '],
              controlSet = new Set(controlArray),
              result = fetchArray.filter(v => !controlSet.has(v));
          
          console.log(result);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-17
            • 1970-01-01
            • 1970-01-01
            • 2018-08-12
            • 1970-01-01
            相关资源
            最近更新 更多