【问题标题】:How do I check if pairs of ints exist in array X, then remove the specific values that form the pairs from array Y?如何检查数组 X 中是否存在整数对,然后从数组 Y 中删除形成整数对的特定值?
【发布时间】:2020-10-20 00:31:37
【问题描述】:

如何检查数组roads 中是否存在j, k[anything][0] 对,然后从数组k 中过滤掉构成数组roads 中的对的特定值?对可以翻转为k[anything][0], j

例如,[1, 0][1, 3] 是否存在于 roads 中?或[0, 1][3, 1]

const j = 1;
let k = [["0", 2],["3", 2]];
const roads = [[0,1],[0,3],[1,2],[1,3]];

我写了一个块,但是当k 中没有更多元素时它会在迭代时中断,因为roads.length 大于k.length

到目前为止我所拥有的。仅供参考,它坏了:

for(let i = 0; i < k.length; i++) {
  let pairs = ([a, b]) => a === k[i][0] && b === j || a === j && b === k[i][0];
  if(roads.some(pairs)) {
    k = k.filter(x => x[0] !== k[i][0])};
};

console.log(k)

期望的结果:

k = [];

第二个例子:

const j = 1;
let k = [["0", 2],["3", 2],["5", 2]];
const roads = [[0,1],[0,3],[1,2],[1,3],[5,6],[5,7]];

第二个期望的结果:

k = [["5", 2]];

【问题讨论】:

  • 你为什么使用k[i]i 只是roads 的索引,与k 无关。
  • k 可以长于 2 吗?
  • 为什么[1, 2] 不在预期结果中? k[0][0]k[1][0] 中没有 2
  • 并且[0, 3] 应该在结果中,因为它没有j
  • 这个问题不是很清楚。这些对是否重要,或者只是检查k 中是否存在任何数字在roads? Are you trying to find any roads that contain any of the pairs in k 中存在?我建议添加另一个示例,该示例使用实际值而不是空数组显示所需结果,因为没有太多可做的事情

标签: javascript for-loop filter


【解决方案1】:

我认为这个问题令人困惑的部分是您基本上没有使用k 中的第二个索引。您只检查配对 [ j, k[anything][0] ]

这使得k[anything][1] 与过滤无关,对吗?如果有,请看下面的代码

const j = 1;
let k = [["0", 2],["3", 2],["5", 2]];
const roads = [[0,1],[0,3],[1,2],[1,3],[5,6],[5,7]];

// results will return the filtered array
// you can instead change `let results` to `k`
// if you want to set it directly
let results = k.filter(kPair => {
    let roadsContainPair = roads.some(roadPair => {
            // check the two cases
            // [j, kPair[0]] and [kPair[0], j]
            return (roadPair[0] === j && roadPair[1] === parseInt(kPair[0])) ||
                (roadPair[0] === parseInt(kPair[0]) && roadPair[1] === j);
        });
    
    // since we only want the pair if roads DOESN'T contain it
    // we return the negative of roadsContainPair
    // i.e. if the current "pair" is found in roads, filter it out
    return !roadsContainPair;
});

// results = [["5", 2]];

【讨论】:

  • 请注意,我使用的是parseInt,如果roadPair[anything] 未存储为整数,您可能还需要这样做
  • 感谢您对此的解释。为了提供更多上下文,我一直在研究一个 leetcode 问题,这是一个我不知道如何编码的特定部分。我成功编写了解决问题的代码。这可能不是最有效的编写方式,但速度很快。 link
【解决方案2】:

使用some() 测试数组中的条件是否匹配。在 if 条件中使用它来查看是否有任何对在 roads 中。

使用includes() 测试值是否在数组中。过滤k时使用它。

const j = 1;
let k = [
  ["0", 2],
  ["3", 2]
];
let roads = [
  [0, 1],
  [0, 3],
  [1, 2],
  [1, 3]
];
let k_parsed = k.map(([x]) => parseInt(x));
if (roads.some(([rx, ry]) => k_parsed.some(kx => (rx == j && ry == kx) || (rx == kx && ry == j)))) {
  k = k.filter(([kx]) => !k_parsed.includes(parseInt(kx)));
}

console.log(k);

k = [["0", 2],["3", 2],["5", 2]];
roads = [[0,1],[0,3],[1,2],[1,3],[5,6],[5,7]];

k_parsed = k.map(([x]) => parseInt(x));
if (roads.some(([rx, ry]) => k_parsed.some(kx => (rx == j && ry == kx) || (rx == kx && ry == j)))) {
  k = k.filter(([kx]) => !k_parsed.includes(parseInt(kx)));
}

console.log(k);

【讨论】:

  • 感谢您的回答。看起来代码适用于第一种情况,但不适用于第二种情况。
  • 第一种情况只是偶然。我认为我的代码现在总是从k 中删除所有内容。
  • 到目前为止,您对此有何看法?出于某种原因,roads.some(pair) 返回falsefor(let i = 0; i &lt; k.length; i++) { const pairs = ([a, b]) =&gt; a === k[i][0] &amp;&amp; b === j || a === j &amp;&amp; b === k[i][0]; if(roads.some(pairs)) { k = k.filter(x =&gt; x[0] !== filteredResult[i][0])};};};
  • cmets 中的代码很难阅读,所以我不确定。编辑问题并将其放入格式化的代码块中。
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
相关资源
最近更新 更多