2017-12-18 8 views
0

includes()find()以内に使用しようとすると2つ以上の項目が表示されません。 JSONファイルは有効です。だから私は不思議だった、これはより良い解決策は、これは動作していないようですか?find()内でincludes()を使用できますか?

async function getTheRightObject(input){ 
    let Obj = await aJSONFile.find(item => item.AnArray.includes(input)); 
    console.log(Obj); 
    return Obj; 
    } 

    let userInput = "annother one"; 

    getTheRightObject(userInput).then(function(output){ 
    console.log(output); 
    }).catch(function (err) { 
    //Error things 
    }); 

JSONのようなもの:

[{ 
    "Id": 1, 
    "Code": "586251af58422732b34344c340ba3", 
    "Input": ["official Name", "officialname", "oficial name", "officcial name"], 
    "Name": "Official Name", 
    "Flavor": "", 
    "Image": "https://123.com/image.png" 
    }, 
    { 
    "Id": 2, 
    "Code": "597f723dceeca347a243422f9910e", 
    "Input": ["another one", "anotherone", "annother one", "another 1"], 
    "Name": "Another One", 
    "Flavor": "A bit of text", 
    "Image": "http://123.com/image2.png" 
    }, 
    etc... 
] 

だから私は、JSONファイルのオブジェクトInputと、ユーザーの入力に一致する、このJSONファイルにオブジェクトを検索したい、と返信Name。しかし、この解決策は、最初の2/3項目程度でしか機能しないようです。

編集: 最初の2つのオブジェクトには小文字しかないようです。 jsonファイルの他のオブジェクトでは、大文字も使用しました。

私の解決策の最後はです。

  1. JSONファイルのすべてのobject.Input = ['text1', 'text2', 'text3, 'etc']は今
  2. 入力にtoLowerCase()を使用する場合低くなっています。以下のように:私はオブジェクトが私の場合は非常にユニークです知っているので

let Obj = await aJSONFile.find(item => item.AnArray.includes(input.toLowerCase));

これは私の場合で動作します。他の場合(つまり、複数のオブジェクトが必要な場合)、Tiny Giantまたはvarit05のソリューションを使用することができます。

答えて

0

ここに行きます!

find:find()メソッドは、指定されたテスト関数を満たす配列の最初の要素の値を返します。

ドキュメント:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

が含ま:は(含む)方法は、配列が必要に応じてtrueまたはfalseを返す、特定の要素を含むかどうかを判定する。

ドキュメント:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

あなたの質問に答えるために:

は、オブジェクトの配列から目的のデータをifforループを使用してみてくださいを。

希望すると助かります!

+0

おかげであなたの応答のためのチームメイト。私はinclude()をfind()の内部で使うことは簡単でクリーンな方法であると考えました。これはjsonファイルの最初の2つの項目で機能していたためです。 私はforループを使用します。 – Hedva

+0

それがあなたを助けることを知ってうれしい! – varit05

0
Array#findに提供する機能の原因となる最初の要素の値を返すのに対し、あなたは、 すべての要素提供される関数がtrueを返すように原因を含む新しい配列を返す Array#filter、探しているように見えます

真を返します。

以下の例では、JSONといくつかの変数名を圧縮し、無関係なasync/awaitの使用を削除して、今後の読者のための読みやすさを助けています。

let data = JSON.parse('[{"id":1,"arr":["a","aa","aaa"]},{"id":2,"arr":["b","bb","bbb"]},{"id":3,"arr":["c","cc","ccc"]},{"id":4,"arr":["a","bb","ccc"]}]'); 
 

 
const filter = (field, input) => data.filter(e => e[field].includes(input)); 
 

 
/* 
 
* For demonstration purposes only. 
 
* Map the result of the filter call to an array of 
 
* matching id's, then output a human readable result 
 
* Example output: "a: [1,4]" 
 
*/ 
 
const test = (...args) => (console.log(`${args[1]}: ${JSON.stringify(filter(...args).map(e => e.id))}`), test); 
 

 
test('arr', 'a') 
 
    ('arr', 'aa') 
 
    ('arr', 'aaa') 
 
    ('arr', 'b') 
 
    ('arr', 'bb') 
 
    ('arr', 'bbb') 
 
    ('arr', 'c') 
 
    ('arr', 'cc') 
 
    ('arr', 'ccc');
.as-console-wrapper { max-height: 100% ! important; height: 100% !important }