我有此代码:
var array1 = [];
array1['sand'] = [[ 'sun', 'moon', 'cool' ], ['man', 'store', 'rose', 'big', 'you', 'sharp', 'low', 'high'], [ 'hot', 'cool', 'lip' ], [ 'store', 'man', 'lip' ]];
array1['king'] = [['store', 'man', 'lip'], ['store', 'man', 'lip'], ['store', 'man', 'lip']];
array1['house'] = [['lip', 'store', 'hot','bed', 'you', 'low','run', 'high'], ['cool', 'sun', 'hot','big', 'sharp', 'low','run', 'high'], [ 'high', 'cool', 'moon', 'lip', 'man' ], ['man', 'store', 'rose','big', 'you', 'sharp','low', 'high']]
array1['bow'] = [['lip', 'store', 'hot','bed', 'you', 'low','run', 'high'], [ 'bed', 'moon', 'lip' ], [ 'low', 'cool', 'lip', 'man' ]]
array1['queen'] = [[ 'cool', 'awe'], ['low', 'dad'], [ 'usa', 'cool', 'ita' ], ['bed', 'glass', 'store', 'sal']];
var array2 = [[ 'sun', 'moon', 'cool' ], [ 'low', 'cool', 'lip', 'man' ], [ 'hot', 'cool', 'lip' ], ['lip', 'store', 'hot','bed', 'you', 'low','run', 'high']];
var array3 = [['man', 'store', 'rose','big', 'you', 'sharp','low', 'high'], [ 'hot', 'cool', 'lip' ], [ 'store', 'man', 'lip' ], [ 'store', 'man', 'lip' ]]
var array4 = [[ 'cool', 'awe'], ['low', 'dad'], [ 'usa', 'cool', 'ita' ]];
如何打印array1
数组的名称,其中每个array2
数组至少具有1个相同的元素?
让我为您展示一些使问题更明确的例子:
例如,我尝试了此方法,但是它不起作用:
console.log(array1.filter(value => array2.includes(value)));
这应该打印“沙”,因为:
['sun','moon','cool']
(来自array1
)和['sun','moon','cool']
(来自array2
)共享字符串'sun'
'moon'
和{{1 }}
并且'earth'
和['man', 'store', 'rose', 'big', 'you', 'sharp', 'low', 'high']
共享[ 'low', 'cool', 'lip', 'man' ]
和'man'
并且'low'
和[ 'hot', 'cool', 'lip' ]
共享[ 'hot', 'cool', 'lip' ]
'hot'
和'cool'
并且'lip'
和[ 'store', 'man', 'lip' ]
共享['lip', 'store', 'hot','bed', 'you', 'low','run', 'high']
和'store'
它还应该打印“ queen”,因为:
['cool','awe'](来自array1)和['sun','moon','cool'](来自array2)共享'cool'
和['low','dad']和['low','cool','lip','man']共享'low'
与['usa','cool','ita']和['hot','cool','lip']共享'cool'
AND [[bed],'glass','store','sal']和['lip','store','hot','bed','you','low', 'run','high']共享“ store”和“ bed”
但是:
'lip'
不应打印任何内容,因为console.log(array1.filter(value => array3.includes(value)));
和array1
不会共享上述任何字符串。
array3
不应该打印任何内容,因为console.log(array1.filter(value => array4.includes(value)));
和array1
不能完全 共享上述任何字符串。
更多示例:
建议的答案几乎是正确的,但是:
如果至少一个子数组的长度相等并且彼此不相同,则不要打印任何内容。例如array4
(来自['sun','moon']
)和anotherData
(来自['sun','cool']
)。这两个长度均为2,且长度不相同,因此请勿打印任何内容。但是:
anotherArray
(来自anotherData)和['sun','moon']
(来自anotherArray2)应该打印。
['sun','moon']
所以:
var anotherData = [];
anotherData['sand'] = [['sun','moon'], ['man', 'store', 'rose', 'big', 'you', 'sharp', 'low', 'high'], [ 'hot', 'cool', 'lip' ], [ 'store', 'man', 'lip' ]];
var anotherArray = [['sun','cool'], [ 'low', 'cool', 'lip', 'man' ], [ 'hot', 'cool', 'lip' ], ['lip', 'store', 'hot','bed', 'you', 'low','run', 'high']];
var anotherArray2 = [['sun','moon'], [ 'low', 'cool', 'lip', 'man' ], [ 'hot', 'cool', 'lip' ], ['lip', 'store', 'hot','bed', 'you', 'low','run', 'high']];
应该什么也不打印。
console.log(getKeys(dataArray, anotherArray));
应打印console.log(getKeys(dataArray, anotherArray2));
如何用最少的代码实现这一目标?
答案 0 :(得分:1)
您可以为每个数组获取一个集合,以通过与相同索引处的集合的值进行比较来对对象的键进行比较和过滤。
function getKeys(object, array) {
var values = array.map(a => new Set(a));
return Object
.keys(object)
.filter(key =>
object[key].length === values.length &&
object[key].every((a, i) => a.some(Set.prototype.has, values[i]))
);
}
var data = {
sand: [['sun', 'moon', 'cool'], ['man', 'store', 'rose', 'big', 'you', 'sharp', 'low', 'high'], ['hot', 'cool', 'lip'], ['store', 'man', 'lip']],
king: [['store', 'man', 'lip'], ['store', 'man', 'lip'], ['store', 'man', 'lip']],
house: [['lip', 'store', 'hot', 'bed', 'you', 'low', 'run', 'high'], ['cool', 'sun', 'hot', 'big', 'sharp', 'low', 'run', 'high'], ['high', 'cool', 'moon', 'lip', 'man'], ['man', 'store', 'rose', 'big', 'you', 'sharp', 'low', 'high']],
bow: [['lip', 'store', 'hot', 'bed', 'you', 'low', 'run', 'high'], ['bed', 'moon', 'lip'], ['low', 'cool', 'lip', 'man']],
queen: [['cool', 'awe'], ['low', 'dad'], ['usa', 'cool', 'ita'], ['bed', 'glass', 'store', 'sal']],
},
array2 = [['sun', 'moon', 'cool'], ['low', 'cool', 'lip', 'man'], ['hot', 'cool', 'lip'], ['lip', 'store', 'hot', 'bed', 'you', 'low', 'run', 'high']],
array3 = [['man', 'store', 'rose', 'big', 'you', 'sharp', 'low', 'high'], ['hot', 'cool', 'lip'], ['store', 'man', 'lip'], ['store', 'man', 'lip']],
array4 = [['cool', 'awe'], ['low', 'dad'], ['usa', 'cool', 'ita']];
console.log(getKeys(data, array2));
console.log(getKeys(data, array3));
console.log(getKeys(data, array4));