我有两个数组:
array1 = ['bob', 's', 'paul'];
array2 = ['bob', 'sue', 'paul'];
我想将array1:'s'中的首字母转换为array2:'sue'中的对应名称。
我也希望它可以逆向工作,其中:
array1 = ['bob', 'sue', 'paul'];
array2 = ['bob', 's', 'paul'];
以便array1中的'sue'将转换为与array2相匹配的's'。
到目前为止,我具有此功能:
function findName(arr1, arr2) {
for (let initial of arr1) {
if (initial.length === 1) {
return arr2.findIndex(name => name[0] === initial) != -1
}
}
}
如果姓名缩写找到匹配的名称,它将返回true,但是我需要该函数实际创建array3以便将其转换为姓名缩写。
换句话说:
array1 = ['bob', 's', 'paul'];
array2 = ['bob', 'sue', 'paul'];
// array3 = ['bob', 'sue', 'paul']; //array 3 maintains the same sequence order as array 1
array1 = ['b', 'sue', 'paul'];
array2 = ['s', 'paul', 'bob'];
// array3 = ['bob', 's', 'paul']; //array 3 maintains the same sequence order as array 1
array1 = ['b', 'sue', 'paul', 'robert'];
array2 = ['s', 'paul', 'bob'];
// array3 = ['bob', 's', 'paul', 'robert']; //array 3 maintains the same sequence order as array 1
array1 = ['b', 'sue', 'paul'];
array2 = ['s', 'paul', 'bob', 'robert'];
// array3 = ['bob', 's', 'paul']; //array 3 maintains the same sequence order as array 1
如果存在多个相同的首字母缩写,只需转换第一个首字母并保留第二个首字母:
array1 = ['b', 'b', 'sue', 'paul'];
array2 = ['s', 'paul', 'bob', 'robert'];
// array3 = ['bob', 'b', 's', 'paul']; //array 3 maintains the same sequence order as array 1
除非姓名缩写找到匹配的集合,请按顺序进行转换:
array1 = ['b', 'b', 'sue', 'paul'];
array2 = ['s', 'paul', 'bob', 'robert', 'bill'];
// array3 = ['bob', 'bill', 's', 'paul']; //array 3 maintains the same sequence order as array 1
我需要能够在此函数之外使用array3。
答案 0 :(得分:1)
转换一个数组中的首字母以匹配另一个数组中的值
let array1 = ['b', 'b', 'sue', 'paul'];
let array2 = ['s', 'paul', 'bob', 'robert', 'bill'];
let array3 = [];
array1.forEach(function(element) {
let item =array2.find((el) => el.startsWith(element[0]));
array3.push(item);
var index = array2.indexOf(item);
if (index > -1) {
array2.splice(index, 1);
}
});
console.log(array3);
答案 1 :(得分:0)
您已经在使用findIndex
来定位元素在数组中的位置;因此,与其扔掉它而只返回一个布尔值以告诉它是否为-1,不如使用它来对数组建立索引(当然,如果它不是-1)。
i = arr2.findIndex(...);
result = (i > -1)? arr2[i] : initial;
答案 2 :(得分:0)
您可以在第一个数组上map
,并像这样使用findIndex
和splice
:
function getArray3(array1, array2) {
let array3 = array1.map(a => {
let found;
if (a.length === 1) {
found = array2.findIndex(b => b.startsWith(a))
} else {
found = array2.findIndex(b => b.length === 1 && a.startsWith(b))
}
return found === -1 ? a : array2.splice(found, 1)[0]
})
return array3
}
console.log(getArray3(['bob', 's', 'paul'], ['bob', 'sue', 'paul']))
// ['bob', 'sue', 'paul'];
console.log(getArray3(['b', 'sue', 'paul'], ['s', 'paul', 'bob']))
// ['bob', 's', 'paul']; //array 3 maintains the same sequence order as array 1
console.log(getArray3(['b', 'sue', 'paul', 'robert'], ['s', 'paul', 'bob']))
// ['bob', 's', 'paul', 'robert']
console.log(getArray3(['b', 'b', 'sue', 'paul'], ['s', 'paul', 'bob', 'robert']))
// ['bob', 'b', 's', 'paul']
console.log(getArray3(['b', 'b', 'sue', 'paul'], ['s', 'paul', 'bob', 'robert', 'bill']))
// ['bob', 'bill', 's', 'paul']
如果您不想突变array2
,可以使用[...array2]
克隆array2
答案 3 :(得分:0)
您可以使用地图查找
这里的想法是-
A
参数。A
的每个值,我们将其与参数B
中的缩写匹配。已经使用过的对象可以跟踪以前使用的替换。
let switcher = (A,B)=>{
let alreadyUsed = {}
return A.map(e => {
let value = B.find(b => b.startsWith( e[0] ) && !alreadyUsed[b] ) || e
if(value && !alreadyUsed[value] ){
alreadyUsed[value] = true
}
return value
})
}
let array1 = ['bob', 's', 'paul'];
let array2 = ['bob', 'sue', 'paul'];
console.log(switcher(array1,array2))
let a1 = ['b', 'b', 'sue', 'paul'];
let a2 = ['s', 'paul', 'bob', 'robert', 'bill'];
console.log(switcher(a1,a2))
答案 4 :(得分:0)
const mapInitials = (a1, a2) => {
a2 = [...a2]; // clone because we're going to be modifying this one
return a1.map((s1) => {
const i = a2.findIndex(s2 => s2[0] === s1[0]);
return i < 0 ? s1 : a2.splice(i, 1)[0];
})
};
const test = (a1, a2) => console.log(...mapInitials(a1, a2));
test(['bob', 's', 'paul'],
['bob', 'sue', 'paul']);
// ['bob', 'sue', 'paul']
test(['b', 'sue', 'paul'],
['s', 'paul', 'bob']);
// ['bob', 's', 'paul']
test(['b', 'sue', 'paul', 'robert'],
['s', 'paul', 'bob']);
// ['bob', 's', 'paul', 'robert']
test(['b', 'sue', 'paul'],
['s', 'paul', 'bob', 'robert']);
// ['bob', 's', 'paul']
test(['b', 'b', 'sue', 'paul'],
['s', 'paul', 'bob', 'robert']);
// ['bob', 'b', 's', 'paul']
test(['b', 'b', 'sue', 'paul'],
['s', 'paul', 'bob', 'robert', 'bill']);
// ['bob', 'bill', 's', 'paul']