2017-09-21 105 views
1

我有一個同義詞庫應用程序,因此用戶可以輸入「dog」作爲基本單詞,而「canine,hound,mutt」作爲同義詞。 然後將它們添加到數據庫中。 除了添加「狗」作爲基本詞,我想爲每個同義詞進行多個同時輸入,以便用戶不必返回並輸入「獵犬」,然後輸入「狗,犬,傻子」。這將涉及多個表單提交。創建數組鍵值和數組數組

基於上述例子中,我想標題到數據庫之前創建以下數據集:

var Keys = 
[ 
    dog,canine,mutt,hound 
]; 

var Values = [ 
    [mutt,canine,hound],[dog,mutt,hound],[canine,dog,hound],[dog,canine,mutt] 
]; 

一旦我有這樣的,我可以通過每個按鍵做一個簡單的循環,並抓住內的相應陣列值,並執行我的插入。例如,當根據它們的長度進行迭代時,我會抓取索引2並獲取'mutt'鍵,然後獲取'[犬,狗,獵犬]'的值。到目前爲止,我嘗試執行所需的嵌套循環來實現這個數據集並沒有證明有效果。

到目前爲止,我已經嘗試過這一點,我希望的一些建議:

var baseWord = []; 
    baseWord.push("dog"); 
    var synonyms = ["hound","mutt","canine"]; 
    var words = baseWord.concat(synonyms);     
    console.log(words.length); //outputs 4 

    //new arrays to hold the result of the inner loop calculation 
    var Keys = []; 
    var Values = []; 
    for(var i = 0; i < words.length; i++){ 
     //removing the inner loops makes this output, the 4 values from the 'words' variable. with the inclusion of the loops, we only get back 'dog' 
     keys.push(words[i]); 


     for(var x = 0; x < words.length; x++){ 
      //I want to loop through the 'words' variable, and if current index of 'words' matches a value in tempValues(matches a different value of tempValues each time, which is what i'd want(it allows us to ignore the current key, and keep the values), then remove that particular value from tempValues, then push the remaining values in tempValues into our 'VAlues' array that we declared ouside all of these loops 
      var tempValues = words; 
      //console.log("tempvalues is :: %s", JSON.stringify(tempValues)); 
       for(var o = 0; o < words.length; o++){ 
        if(words[o] === words[x]){ 
         //get rid of the value in tempValues that is equals to the value of the key in the outer loop(for this particular iteration) 
         tempValues.splice(tempValues[o]); 
        } 
        console.log(JSON.stringify(tempValues)); 
       } 
       Values.push(tempValues); 
     }; 
    }; 
    console.log("the new keys array is :: %s", JSON.stringify(Keys)); //keep getting dog 
    console.log("the new values array is :: %s", JSON.stringify(Values)); //keep getting [[]] 
+0

是您的PHP代碼重要? – Scuzzy

+0

不,但這是除了陣列以外唯一的其他建議,我認爲這將有助於暴露我認爲是一個常見問題。 – OisinFoley

回答

1

下面是一個簡單的循環來構建輸出。

外環是你的鑰匙,而內環建立一組推到你的價值觀陣列

var BaseWord = 'dog'; 
var Synonyms = ['canine','mutt','hound']; 
var Keys = Synonyms; 
var Values = []; 

Keys.unshift(BaseWord); // add baseword to the start of Keys 

for(var i = 0; i < Keys.length; i++) 
{ 
    var Set = []; 
    for(var j = 0; j < Keys.length; j++) 
    { 
    if(Keys[j] !== Keys[i]) 
    { 
     Set.push(Keys[j]); 
    } 
    } 
    Values.push(Set); 
} 

console.log("the new keys array is :: %s", JSON.stringify(Keys)); 
console.log("the new Values array is :: %s", JSON.stringify(Values)); 

這是我如何會在PHP中做到這一點

$BaseWord = 'dog'; 
$Synonyms = array('dog','canine','mutt','hound'); 

$keys = array($BaseWord) + $Synonyms; 
$values = array(); 

foreach($keys as $key) 
{ 
    $values[] = array_values(array_diff($keys, array($key))); 
} 

echo json_encode($keys); 
echo json_encode($values); 
+0

歡呼聲Scuzzy。雖然Alex's是更有用的解決方案,但您的答案輸出與問題完美匹配。 – OisinFoley

1

外貌就像@Scuzzy有一個關於如何去做的答案。我會讓你知道你做錯了什麼。

1.本

var tempValues = words; 

words是一個數組。這意味着它通過引用傳遞。這意味着tempValueISwords,並且您對tempValue所做的任何編輯都將完成到words。這使我下一個問題:

2.您使用的拼接錯誤

tempValues.splice(tempValues[o]); 

這相當於:

tempValues.splice("dog"); 

在第一次通過這個循環。不幸的是,Array.splice不會將字符串作爲第一個參數。它需要一個索引。如果字符串通過,MDN不會記錄它的作用。但它的行爲就像放置了一個0.

.splice(0)表示從第0個索引開始的數組中刪除所有內容。所以,在你通過臨時數組的第一個循環中,它將所有東西都刪除,然後不再循環(因爲沒有剩下的東西可以循環)。所以,tempArray變成[]。

+0

感謝jlogan,我想我需要重新熟悉splice的行爲 – OisinFoley

2

嘗試這樣:

//OP code 
 
var baseWord = []; 
 
baseWord.push("dog"); 
 
var synonyms = ["hound", "mutt", "canine"]; 
 
var words = baseWord.concat(synonyms); 
 
console.log(words.length); //outputs 4 
 

 
//and new code 
 
//put result into an object 
 
var dictionary = {}; 
 
for (var i = 0, w; w = words[i]; ++i) { 
 
    //take each word (w) 
 
    dictionary[w] = words.filter(function(word) { 
 
    return word != w; //all words except w 
 
    }); 
 
} 
 
//take the object 
 
console.log(dictionary); 
 
//or stringify it 
 
console.log(JSON.stringify(dictionary)); 
 

 
//Just for OP 
 
console.log('direct answer'); 
 
var keys = words.map(function(word) { 
 
    return word; 
 
}); 
 
console.log('Keys :: ' + JSON.stringify(keys));//same as "words" 
 

 
var values = words.map(function(word) { 
 
    return words.filter(function(w) { 
 
    return word != w; //all words except w 
 
    }); 
 
}); 
 
console.log('Values :: ' + JSON.stringify(values)); 
 

 
//ES6 style 
 
console.log('ES6 style'); 
 
var keys = words.map(word => { 
 
    return word; 
 
}); 
 
console.log('Keys :: ' + JSON.stringify(keys));//same as "words" 
 

 
var values = words.map(word => { 
 
    return words.filter(w => { 
 
    return word != w; //all words except w 
 
    }); 
 
}); 
 
console.log('Values :: ' + JSON.stringify(values)); 
 

 
//or even All In One 
 
console.log('All In One'); 
 
var keyValues = words.map(word => { 
 
return [word, words.filter(w => {return word != w;})]; 
 
}); 
 
console.log(JSON.stringify(keyValues));

+0

偉大的答案亞歷克斯。這是我將要使用的解決方案,但我認爲我必須將接受的答案提供給Scuzzy,因爲他的解決方案回答了問題的具體內容,即填充「Keys」和「Values」變量。 – OisinFoley

+0

@OisinFoley看看更新的答案。無需切換接受的答案。只要看看現代JS可以做什麼;)。 –