【问题标题】:Find value and index of Javascript array element when the index meets another condition当索引满足另一个条件时,查找 Javascript 数组元素的值和索引
【发布时间】:2019-01-30 22:30:11
【问题描述】:

我有两个数组:

arr1 = [0,1,1,0]
arr2 = [a,b,c,d]

我想找到 arr2[ i ] 的值和对应的索引,其中 i 使得 arr1[ i ] != 0 而不遍历 arr2 中的每个位置。什么有效的技术可以做以下事情:

arr2.forEach( ( 'element with index such that arr1[index] != 0') => {} );

** EDIT ** 这个问题的最初发布并不清楚是否需要记录满足条件的元素的索引。

【问题讨论】:

  • 您必须以一种或另一种方式遍历数组以找到非零条目。
  • 最有效的方法是简单的for-loop over arr1...for(...) if (arr1[i] === 0) doSomething(arr2[i])
  • 如果您迭代的集合(相对)不变,那么您可以按条件排序,然后对要查找的内容进行二进制搜索。
  • @Tony 排序是O(n log n),然后是二分查找O(log n),而循环是O(n)。我并不是说你的建议是错误的,只是需要非常特定的情况才能最有效。
  • 我不知道实际设置的 interwebjill 将使用什么,也不知道它在应用程序的生命周期中如何变化。这就是为什么我提到它是否不变。 log n解可能是最优解,不知道信息不够

标签: javascript arrays


【解决方案1】:

对此的另一种解决方案是在 arra1 上使用 reduce()

const arr1 = [0,1,1,0,1];
const arr2 = ["a","b","c","d","e"];

let res = arr1.reduce(
    (acc, v, idx) => v ? acc.concat({val: arr2[idx], idx}) : acc,
    []
);

console.log(res);

【讨论】:

    【解决方案2】:

    编辑:获取索引也很容易 - 更新了答案

    您说您不想循环遍历 arr2,但您可以做的是循环遍历 arr1 并在每次遇到这样的命中时收集 arr2 的相应值:

    let result = []
    arr1.forEach((value, idx) => {
        if (value !== 0) result.push({index: idx, value: arr2[idx]})
    }
    

    虽然这似乎是围绕您的要求的一种破解。 除此之外,我认为您别无选择,只能循环遍历任一数组(优化:仅循环遍历最小的数组)。

    如果你想要完整的结果,你必须检查 arr2 的每个元素的条件,因为如果你不在那里,可能仍然会从你的结果中丢失一些元素。

    【讨论】:

      【解决方案3】:

      只需使用filter:

      arr1 = [0,1,1,0]
      arr2 = ['a','b','c','d']
      
      console.log( arr2.filter((item, index) => arr1[index] !== 0) )

      【讨论】:

      • 你打败了我。此外,您可以只使用 arr2.filter((c,i) => !!arr1[i]);
      • 我想捕获索引以及项目。回顾我的问题,我并不清楚。
      【解决方案4】:

      您可以将数组 1 缩减为您想要的索引,当您需要这些值时,您可以将它们映射到数组 2 中的值

      let arr1 = [0, 1, 1, 0];
      let arr2 = ['a', 'b', 'c', 'd'];
      
      let indexes = arr1.reduce((results, val, index) => {
        if (val) {
          results.push(index);
        }
        return results;
      }, []);
      
      console.log(indexes);
      
      let vals = indexes.map(idx => arr2[idx]);
      
      console.log(vals);

      【讨论】:

        【解决方案5】:

        试试$.each()

        $(function() {
          var arr1 = [0, 1, 1, 0];
          var arr2 = ['a', 'b', 'c', 'd'];
        
          $.each(arr1, function(k, v) {
            if (!v) {
              console.log(arr2[k]);
            }
          });
        });
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

        显然,数组的大小必须相同,或者arr1 可以小于arr2

        希望对您有所帮助。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-07
        • 2020-12-21
        • 2018-12-08
        • 1970-01-01
        • 2016-09-24
        • 1970-01-01
        • 1970-01-01
        • 2019-11-27
        相关资源
        最近更新 更多