我想要一个函数返回 true当且仅当给定数组包含给定“目标”数组的所有元素。如下所示。
true
const target = [ 1, 2, 3, ]; const array1 = [ 1, 2, 3, ]; // true const array2 = [ 1, 2, 3, 4, ]; // true const array3 = [ 1, 2, ]; // false
我怎样才能达到以上的效果?
你可以结合 .every()和 .includes()的方法:
.every()
.includes()
let array1 = [1,2,3], array2 = [1,2,3,4], array3 = [1,2]; let checker = (arr, target) => target.every(v => arr.includes(v)); console.log(checker(array2, array1)); // true console.log(checker(array3, array1)); // false
You can try with Array.prototype.every():
Array.prototype.every()
every()方法测试数组中的所有元素是否通过由提供的函数实现的测试。
every()
及 Array.prototype.includes():
Array.prototype.includes()
includes()方法确定数组是否包含某个元素,并适当地返回 true 或 false。
includes()
var mainArr = [1,2,3]; function isTrue(arr, arr2){ return arr.every(i => arr2.includes(i)); } console.log(isTrue(mainArr, [1,2,3])); console.log(isTrue(mainArr, [1,2,3,4])); console.log(isTrue(mainArr, [1,2]));
如果您正在使用 ES5,那么您可以简单地这样做。
targetArray =[1,2,3]; array1 = [1,2,3]; //return true array2 = [1,2,3,4]; //return true array3 = [1,2] //return false console.log(targetArray.every(function(val) { return array1.indexOf(val) >= 0; })); //true console.log(targetArray.every(function(val) { return array2.indexOf(val) >= 0; })); // true console.log(targetArray.every(function(val) { return array3.indexOf(val) >= 0; }));// false
我用的是纯 Javascript。
function checkElementsinArray(fixedArray,inputArray) { var fixedArraylen = fixedArray.length; var inputArraylen = inputArray.length; if(fixedArraylen<=inputArraylen) { for(var i=0;i<fixedArraylen;i++) { if(!(inputArray.indexOf(fixedArray[i])>=0)) { return false; } } } else { return false; } return true; } console.log(checkElementsinArray([1,2,3], [1,2,3])); console.log(checkElementsinArray([1,2,3], [1,2,3,4])); console.log(checkElementsinArray([1,2,3], [1,2]));
every()方法测试数组中的所有元素是否通过由提供的函数实现的测试。它返回一个布尔值。理所当然地,如果对原始数组调用 every()并向其提供一个函数来检查原始数组中的每个元素是否包含在另一个数组中,就会得到答案。因此:
const ar1 = ['a', 'b']; const ar2 = ['c', 'd', 'a', 'z', 'g', 'b']; if(ar1.every(r => ar2.includes(r))){ console.log('Found all of', ar1, 'in', ar2); }else{ console.log('Did not find all of', ar1, 'in', ar2); }
Reduce 在这里也可以使用(但它有 O = (N * M)的难度) :
const result = target.reduce((acc, el) => { return acc && array.includes(el) }, true);
To solve this in more efficient way(O = N + M):
const myMap = new Map(); array.forEach(element => myMap.set(element); const result = target.reduce((acc, el) => { return acc && myMap.has(el) }, true);