我有两个带数字的变量,我需要弄清楚哪些才知道哪些部分是相同的。我想即使可能的话也可以使用两个以上的字符串。
我可以使用(var1.indexOf(?) > -1 && var2.indexOf(?) > -1)
,但必须覆盖所有可能的数字。 (或者字母,如果我想比较字符串)
如果在我的特定情况下有帮助,则这些数字来自以下类型的变量作为示例:
const originalVar1 = [1,3,2,0,6]
const var1 = originalVar1.sort().join('');
const var1 = '01236';
const var2 = '12345';
let same = '';
for (let i = 0; i < 10; i++) {
same += (var1.indexOf(i) > -1 && var2.indexOf(i) > -1) ? `${i}` : '';
}
console.log(same); // Outputs: 123
我的解决方案可以工作,但感觉应该已经有一些内置的函数或方法可以做到这一点。也许我的解决方案可能会更优雅,因为它不能涵盖所有字符。
示例:
var1 = '01456'
var2 = '0246'
whatIsTheSame(var1, var2) // Expected output: 046
var1 = '12359'
var2 = '035679'
whatIsTheSame(var1, var2) // Expected output: 359
shash678解决方案非常适合为每个变量中出现的每个字符获取1个实例。以下解决方案为您提供了出现在每个变量中的每个字符的所有实例。
value = [ '39291', '3902', '3039903', '39039311873', '3737298' ]
value.sort((a, b) => b.length - a.length);
let matches = value[0];
for (let i = 1; i < value.length; i++) {
matches = (matches.match(new RegExp(`[${value[i]}]`, 'g')) || []).join('');
}
console.log(matches); // Outputs: 393933
这是基于此处的以下答案:
https://stackoverflow.com/a/51179953/11866303按长度对数组进行排序
https://stackoverflow.com/a/41708135/11866303正则表达式解决方案
这可能会更优雅,但我不是最好的。谢谢大家。
答案 0 :(得分:2)
使用扩展运算符并减少可满足您对n
个参数数量的要求:
const whatIsTheSameHelper = (s1, s2) => {
const s2Set = new Set(s2)
return new Set([...s1].filter(x => s2Set.has(x)))
}
const whatIsTheSame = (...vars) => {
return vars.reduce(whatIsTheSameHelper)
}
const var1 = '01236'
const var2 = '12345'
const var3 = '0246'
console.log(whatIsTheSame(var1, var2, var3))
输出:
Set { '2' }
答案 1 :(得分:0)
获得O(m + n)时间中两个数组的交集的通用ES6解决方案是将一个放入Set
中,然后根据集合中的值过滤另一个:
const intersection = (array1, array2) => {
const set2 = new Set(array2);
return array1.filter(x => set2.has(x));
};
// alternatively, (array1, array2) => array1.filter(Set.prototype.has, new Set(array2));
const originalVar1 = [1, 3, 2, 0, 6];
const originalVar2 = [2, 4, 3, 1, 5];
console.log(intersection(originalVar1.sort(), originalVar2.sort()));
这将保留array1
的顺序。如果在需要进行交点时只剩下字符串,则该函数是类似的。