2017-01-31 23 views
0

こんにちはだから、array1(2x2)のすべての単語をarrayChoose(3x1)の単語にマッチさせ、arrayReplacewith(3x1)の単語をJavascriptを使って置き換えることです。私はマッピングや置き換えを含むいくつかの方法を試しましたが、私は周りを回り、進行する方法がわかりません。配列の要素の文字列を別の配列の要素の文字列に置き換えるにはどうすればよいですか?

編集:コンテキストを追加するだけで、csvファイルからすべての配列をロードしています。 また、配列の選択と置換は、必ずしも同じ長さである必要はありません。

edit2:問題は直面しています。第2に、すべての要素の文字列を置き換えるソリューションは文字列の最初のインスタンスを置き換えるだけで、グローバル置換を実装することはできませんでした。

ご協力いただければ幸いです。ありがとう。

var array1 = [["today is the day","or maybe it's tomorrow"],["who knows really","it's just where we are"]]; 

var arrayChoose = ["today", "tomorrow", "just"]; 

var arrayReplacewith = ["monday", "tuesday", "not"]; 

ソリューションその答えを貢献したみんなに感謝し 。私は@ mohamed-ibrahimによって提供されたものを利用しました。

var arrayIncorrect = [ [ 'Trump has ordered', 'flight attendants to stop' ], 
    [ 'shorter people to ', 'restrict tourism.' ], 
    [ 'Now all they ', 'need is a wall.' ] ]; 

var dataChoose = [ [ 'Trump' ], 
    [ 'stop' ], 
    [ 'people' ], 
    [ 'restrict' ], 
    [ 'wall' ] ]; 

var dataReplace = [ [ 'Kim Jong-un' ], 
    [ 'wear' ], 
    [ 'skirts' ], 
    [ 'boost' ], 
    [ 'airplane' ] ]; 

arrayCorrect= 
    arrayIncorrect.map(function(array1){ 
     return array1.map(function(ele){ 
       dataChoose.forEach(function(choose){ 
       ele = ele.replace(new RegExp(choose, 'g'), dataReplace[dataChoose.indexOf(choose)]) ; 
       }) 
       return ele; 
      }) 
    }); 

    console.log(arrayCorrect) 

ご質問がある場合は私に知らせてください(アレイが、CSVファイルからロードされ、完全な例えばhereを参照)...以下のソリューションを参照してください。

+0

あなたは 'array1'でいくつかのコンマを逃しています。ポストされたコードは構文エラーを生成します。 – Pointy

+0

ええ、2x2アレイにする必要がある場合は、 var array1 = [["今日はその日です"私たちです"]]; オブジェクトを追加する: var array1 = [{obj1: "今日はその日です"、obj2: "それは明日です"}、{obj1: "本当に知っている人"、obj2: "それはちょうど私たちの所です"}] ; – tcoulson

+0

申し訳ありませんが、コードを修正しました。ありがとうございます。 – TopGangMember

答えて

1

次のことを試してください:2つの単純なmap年代は、トリックを行います

var array1 = [["today is the day","or maybe it's tomorrow"],["who knows really","it's just where we are"]]; 
var arrayChoose = ["today", "tomorrow", "just"]; 
var arrayReplacewith = ["monday", "tuesday", "not"]; 

array1 = 
    array1.map(function(array2){ 
    return array2.map(function(ele){ 
       arrayChoose.forEach(function(choose){ 
       ele = ele.replace(new RegExp(choose, 'g'), arrayReplacewith[arrayChoose.indexOf(choose)]) ; 
       }) 
       return ele; 
      }) 
    }); 
+0

を更新します。こんにちは、この回答ありがとうございます。私はarray1で最初に間違いを犯して更新してしまったのではないかと心配しています。これは2x2配列でなければなりません。このコードをそれに適応させることはできますか? – TopGangMember

+0

@TopGangMember 2x2のアップデート –

+0

これを更新していただきありがとうございます。これは各要素の最初の一致で機能しますが、単語が繰り返され、それぞれを置換する必要があるときはグローバル置換を使用しないでください。 – TopGangMember

1

、選択した列が置き換え配列よりも多くのエントリを持っている場合、これは潜在的にエラーがスローされますので、あなたは確認のことを確認する必要がありますそうではありません。

var array1 = ["today is the day", "or maybe it's tomorrow", "who knows really", "it's just where we are"]; 
 
var arrayChoose = ["today", "tomorrow", "just"]; 
 
var arrayReplacewith = ["monday", "tuesday", "not"]; 
 

 
array1 = array1.map(v => { 
 
    let s = v.split(" ").map(st => { 
 
    let index = arrayChoose.indexOf(st); 
 
    return index > -1 ? arrayReplacewith[index] : st; 
 
    }); 
 
    return s.join(" "); 
 
}); 
 

 
console.log(array1);

1

つES6 arrow functions.map.indexOfを使用したアプローチ:

replaceArr = (arrOriginal, arrWordsToMatch, arrWordsToReplace) => {   
    if (arrWordsToMatch.length != arrWordsToReplace.length) throw "arrWordsToMatch and arrWordsToReplace must have exact length" 
    return arrOriginal.map((phrase) => { 
     return phrase.split(" ").map((word) => { 
      let foundIndex = arrWordsToMatch.indexOf(word) 
      return (foundIndex > -1) ? arrWordsToReplace[foundIndex] : word 
     }).join(" ") 
    }) 
} 

let newArray = replaceArr(array1, arrayChoose, arrayReplacewith); 

console.log(newArray); 
/* 
    [ 'monday is the day', 
    'or maybe it\'s tuesday', 
    'who knows really', 
    'it\'s not where we are' ] 
*/ 

arrWordsToMatcharrWordsToReplaceが同じ長さを有していなければならないように、それはサイズが異なる場合、エラーをスロー。

1

置換文字列に正規表現とオブジェクトを使用できます。

var array = [["today is the day", "or maybe it's tomorrow"], ["who knows really", "it's just where we are"]], 
 
    object = { today: 'monday', tomorrow: 'tuesday', just: 'not' }, 
 
    result = array.map(function (a) { 
 
     return a.map(function(b) { 
 
      return b.replace(RegExp(Object.keys(object).join('|'), 'g'), function (s) { 
 
       return object[s]; 
 
      }); 
 
     }); 
 
    }); 
 

 
console.log(result);

ES6

var array = [["today is the day", "or maybe it's tomorrow"], ["who knows really", "it's just where we are"]], 
 
    object = { today: 'monday', tomorrow: 'tuesday', just: 'not' }, 
 
    result = array.map(a => a.map(b => b.replace(RegExp(Object.keys(object).join('|'), 'g'), s => object[s]))); 
 

 
console.log(result);

+0

こんにちは、この回答ありがとうございます。オブジェクトを使用する際の問題は、CSVファイルからすべての配列をロードしているため、これが機能しないことです。私は2x2以上の配列でなければならないので、問題のarray1を更新しました。以前は間違って書かれていました。 – TopGangMember

+0

@TopGangMember、editをご覧ください。 –

関連する問題