合并数组和字符串之间的问题

时间:2016-09-12 23:19:08

标签: javascript arrays string algorithm merge

我有一个包含字母和颜色的数组。

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';

同时保留字符到颜色的原始映射。例如,组成heythere的字符应该仍为红色,绿色,最初绘制在数组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用于区分文本的算法可以在这里工作,但我不确定如何复制它,或者它在这个用例中是否有效。

编辑: 我修改了一下因为我意识到它有些不一致。

1 个答案:

答案 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;
}