查找对第二个数组中的所有元素都成立的数组元素

Find array element that is true for ALL elements in the second array

我试图通过使用 % num === 0 将一个数组与另一个数组中的值进行比较,从而从中找到最小公倍数。答案应该是 6,但是因为第一个数组中的每个数字至少有一次为真,所以它们都会被返回。如何找到只为真不为假的值?

let arr = [1, 2, 3]

function test(arr) {
    let x = [1, 2, 3, 4, 5, 6, 7, 8]
    for (let n of arr) {
        return x.filter(k => k % n === 0)
    }
}

console.log(test(arr))

过滤和相交

let arr = [1, 2, 3]
let x = [1, 2, 3, 4, 5, 6, 7, 8]

function test(arr) {
  let common = []
  arr.forEach(n => common.push(x.filter(k => k % n === 0)))
  return common.reduce((acc, cur) => acc.filter(e => cur.includes(e)));
}


console.log(test(arr))

您需要遍历 x 数组和 return 第一个除以 arr 中的 every 值的元素。

let arr = [1, 2, 3];

function test(arr) {
  let x = [1, 2, 3, 4, 5, 6, 7, 8];
  for (let n of x) {
    if (arr.every((a) => n % a === 0)) {
      return n;
    }
  }
}

console.log(test(arr));

您也可以使用 Array.prototype.find.

来简化解决方案

const 
  arr = [1, 2, 3],
  test = (arr) =>
    [1, 2, 3, 4, 5, 6, 7, 8].find((n) => arr.every((a) => n % a === 0));

console.log(test(arr));

注意:如果x排序,那么您必须先对其进行排序。

const arr = [1, 2, 3],
  test = (arr) =>
    [8, 7, 6, 5, 4, 3, 2, 1]
      .sort((a, b) => a - b)
      .find((n) => arr.every((a) => n % a === 0));

console.log(test(arr));

根据 OP 的评论更新

您可以使用 Array.prototype.filter and Array.prototype.some.

const arr = [1, 2, 3],
  test = (arr) =>
    [1, 2, 3, 4, 5, 6, 7, 8].filter((n) => arr.some((a) => n / a === 2));

console.log(test(arr));

如果x被排序可以使用findevery

let arr = [1, 2, 3]
let x = [1, 2, 3, 4, 5, 6, 7, 8, 12]

let res = x.find(n => arr.every(a => n%a === 0))
console.log(res)

如果未排序 x

let arr = [1, 2, 3]
let x = [1, 12, 6, 4, 2, 7, 8]

let res = [...x].sort((a,b)=> a-b).find(n => arr.every(a => n%a === 0))

console.log(res)

晚会回答

您可以使用 Array.reduce. Here we initialize it with an empty array and then use a ternary operator to append values that pass the remainder 测试用一行代码解决这个问题。请注意,我们不需要检查零 (c % n === 0),因为我们将结果视为布尔值。

x.reduce((p,c) => c % n ? p : p.concat([c]), [])

// TEST

const x = [1, 2, 3, 4, 5, 6, 7, 8];

[1, 2, 3].forEach(n => {

  console.log( 
     "n =" + n,
     x.reduce((p,c) => c % n ? p : p.concat([c]), [])
  );

});