我有一个包含字母和颜色的数组。
const a = [
{char: 'h', color: 'red'},
{char: 'e', color: 'red'},
{char: 'y', color: 'red'},
{char: ' ', color: 'green'},
{char: 't', color: 'red'},
{char: 'h', color: 'red'},
{char: 'e', color: 'red'},
{char: 'r', color: 'red'},
{char: 'e', color: 'red'}
];
我想编写一个将其与字符串合并的函数:
const s = 'hey, howdy there';
同时保留字符到颜色的原始映射。例如,组成hey
和there
的字符应该仍为红色,绿色,最初绘制在数组a中,而新字符默认为任意字段,例如黄色并且旧的字符被删除。所以,这个函数的输出会给我一些类似的东西:
res = [
{char: 'h', color: 'red'},
{char: 'e', color: 'red'},
{char: 'y', color: 'red'},
{char: ',', color: 'yellow'},
{char: ' ', color: 'green'},
{char: 'h', color: 'yellow'},
{char: 'o', color: 'yellow'},
{char: 'w', color: 'yellow'},
{char: 'd', color: 'yellow'},
{char: 'y', color: 'yellow'},
{char: ' ', color: 'yellow'},
{char: 't', color: 'red'},
{char: 'h', color: 'red'},
{char: 'e', color: 'red'},
{char: 'r', color: 'red'},
{char: 'e', color: 'red'}
];
一种方法可能是从const a
中提取字符,将它们连接成一个字符串并在空格上分割,这样就有了一个单词数组。用字符串s重复。循环遍历字符串s的新拆分数组,直到它与原始数组之间不匹配为止。这将发生在,
char上。
这是我不知道如何继续的地方。在一个简单的例子中,只有两个单词,你可以保留第一个单词,并用字符串s split中的新单词替换其他所有单词。但是,在我提供的情况下,我正在为新字符串添加值(即, howdy
),同时保留旧数组(there
)的值。
我认为git用于区分文本的算法可以在这里工作,但我不确定如何复制它,或者它在这个用例中是否有效。
编辑: 我修改了一下因为我意识到它有些不一致。
答案 0 :(得分:0)
这样的事情怎么样?
https://jsfiddle.net/jdv9gz01/
function megaJoin (orig, newWord, index) {
var tmpArr = orig.slice();
var newWordArray = newWord.split('').map((char)=>{return {char:char, color:'yellow'}});
Array.prototype.splice.apply(tmpArr, [index,0].concat(newWordArray));
return tmpArr;
}
我不确定连接应该在哪里发生,所以我的函数使用index来知道我们应该在哪里加入。
如果你不知道newWord是什么,这个函数会得到它。这不完美。
function getDifference(weirdArray, newString) {
var tmps = [];
for (var i = 0; i <= weirdArray.length; i++) {
var word = a[i];
if (word && word.char !== '' && i !== a.length) {
tmps.push(word.char);
} else {
newString = newString.replace(tmps.join(''), '');
tmps = [];
}
}
return newString;
}