2016-10-04 1 views
-3

コーディングに関しては初心者ですが、私は次のことを達成しようとしています。文字列に多次元配列のすべての単語が含まれているかどうかをチェックする方法は?

私はこのような多次元配列を持っている:私はHTML要素から文字列を取得しています

var requiredProducts = [{ 
    product: 'PRODUCT 1', 
    keywords: ['KEYWORD1', 'KEYWORD2', 'KEYWORD3'], 
    price: '50.00' 
},{ 
    product: 'PRODUCT 2', 
    keywords: ['KEYWORD4', 'KEYWORD5', 'KEYWORD6'], 
    price: '50.00' 
}]; 

例えば言う:

この文字列は素晴らしいです、それはKEYWORD1とKEYWORD3が含まれています、KEYWORD2

文字列にキーワード配列のすべてのキーワードが含まれているかどうかを確認するにはどうすればよいですか?問題)。私は数日間様々なことを試してきましたが、痛い脳だけを達成していませんでした。

感謝して感謝します。

これは、これを追加しようとしているコードブロックに役立つ場合。新しい関数は '***'から呼び出され、キーワードがすべて見つかるとこの関数が続行されます。

function checkPopup(jNode) { 
console.log(scriptName + 'Found new popup.'); 
console.log(scriptName + 'Checking popup...'); 
linkText = jNode.attr("title"); 
linkText = linkText.toUpperCase(); 
console.log(scriptName + 'Popup: ' + linkText); 
if *** { 
    console.log(scriptName + 'Popup matched.'); 
} else { 
    console.log(scriptName + 'Product not matched.'); 
} 
} 
+1

1)あなたが試したことを投稿してください。あなたが働いている文脈を見ることが重要です2)検索対象のキーワードに「製品」がどのような影響を与えていますか? –

+0

同上@RoryMcCrossanは言った。あなたが*「さまざまなことを日々試している」*として記述している**コード例**を投稿してください。 –

+0

こんにちは、ロリー、返事ありがとうございました。私は試した様々な方法を追跡していません(私は新鮮です)。基本的に私はネットを精査し、私が出会ったさまざまなソリューションを試しました。私が考えている問題は、それらを自分の要求に合わせて調整していたことです(ほとんどの場合、多次元配列を使用しています)。私がコード内の他の場所に返す製品は、ほとんどの場合、価格が一致すると、この部分は正常に動作します。 –

答えて

-2

あなたはそれは、アレイ内の項目の上に述語関数を実行し、唯一の各反復がtrueを返した場合にtrueを返しますArray.prototype.every使用することができます。

Array.prototype.everyは最新のブラウザでのみサポートされています。ここ

var requiredProducts = [{ 
 
    product: 'PRODUCT 1', 
 
    keyword: ['KEYWORD1', 'KEYWORD2', 'KEYWORD3'], 
 
    price: '50.00' 
 
}, { 
 
    product: 'PRODUCT 2', 
 
    keyword: ['KEYWORD4', 'KEYWORD5', 'KEYWORD6'], 
 
    price: '50.00' 
 
}]; 
 

 
var str1 = 'This string is fantastic, it contains KEYWORD1 and KEYWORD3, and KEYWORD2' 
 
var str2 = 'This string is fantastic, it contains KEYWORD4 and KEYWORD5, and KEYWORD6' 
 

 

 
function matchProductByKeywords(str, products) { 
 
    return products.filter(function(product){ 
 
    return product.keyword.every(
 
     function(word) { 
 
     return str.match(word) 
 
     } 
 
    ) 
 
    }) 
 
} 
 
console.log(
 
    'str1', matchProductByKeywords(str1, requiredProducts), 
 
    'str2', matchProductByKeywords(str2, requiredProducts) 
 
)

あなたが使用できるすべてのためのシムです。サポートされていないブラウザの場合

Array.prototype.every = Array.prototype.every || function(predicate){ 
    for (var ii = 0, ll = this.length; ii < ll; ii+=1) { 
    if (!predicate.call(this, this[ii], ii, this)) { 
    return false 
    } 
    } 
    return true 
} 
+0

はフルブラウザをサポートしていない機能を使用する場合には常に明らかにする必要があります – charlietfl

+0

これでも問題は解決しません。はい、それは個別に各値をチェックしますが、それらをすべて一緒にチェックしません。 –

+0

必要な配列の 'every'キーワードが文字列内にあることを確認します。それが問題でした。 – synthet1c

0

2つの配列の交差を計算するために外部モジュールまたはライブラリを使用していないとします。試してみてください:

var phrase = "This string is fantastic, it contains KEYWORD1 and KEYWORD3, and KEYWORD2"; 
var words = phrase.split(/[\s,]/); 

var results = [] 

requiredProducts.forEach(function (item) { 
    var intersection = item.keyword.filter(function(value) { 
     return words.indexOf(value) > -1; 
    }); 
    results.push({ 
     product: item.product, 
     match: item.keyword.length === intersection.length, 
     intersection: intersection 
    }); 
}); 

console.log(results); 
関連する問題