фильтровать json объекты по идентификатору в Javascript - PullRequest
0 голосов
/ 17 июня 2019

У меня есть JSON, который возвращает массив массивов объектов, но я хочу вернуть массив объектов, отфильтрованных по идентификатору. Это код, который я построил до сих пор:

    let objComedien3=[];
      let i=0;

      for (var prop in bc) {
        objComedien3[i] = await app.models.cm_comediens_extraits_mp3.find({ where: { idMedia: bc[prop]} } );
        //here the result is giving me an array of arrays of objects so I had to do this :
        objComedien3[i]= Object.assign({}, objComedien3[i]);
        i++;
      }
      return objComedien3;

Окончательный результат, который я нашел, это:

[
  {
    "0": {
      "idSon": 33274,
      "idMedia": 42084,
      "qfDiffusion": null,
      "qfAccent": null,
      "qfAge": 169,
      "qfCartoon": null,
      "qfDoublage": null,
      "qfInterpretation1": 194,
      "qfInterpretation2": 194,
      "qfInterpretation3": 193,
      "qfImitation": null,
      "qfLangue": 145,
      "qfTimbre": 237,
      "qfType": 245,
      "qfGenre": "Masculin",
      "description": "Techno Music"
    }
  },
  {
    "0": {
      "idSon": 33275,
      "idMedia": 42086,
      "qfDiffusion": null,
      "qfAccent": null,
      "qfAge": 240,
      "qfCartoon": null,
      "qfDoublage": null,
      "qfInterpretation1": 196,
      "qfInterpretation2": 195,
      "qfInterpretation3": 247,
      "qfImitation": null,
      "qfLangue": 147,
      "qfTimbre": 236,
      "qfType": 176,
      "qfGenre": "Masculin",
      "description": "Techno Music"
    }
  }
]

Все хорошо, за исключением того, что я хочу заменить 0 на idSon, и я не знал, как управлять этим с помощью Object.assign или любой другой функции, использующей javascript. Любая помощь будет оценена. Большое вам спасибо

Ответы [ 4 ]

3 голосов
/ 17 июня 2019

Попробуйте это:

 let objComedien3=[];
      let i=0;

      for (var prop in bc) {
        objComedien3[i] = await app.models.cm_comediens_extraits_mp3.find({ where: { idMedia: bc[prop]} } );
        //here the result is giving me an array of arrays of objects so I had to do this :
        let data= {}
        data[objComedien3[i][0]['idSon']] = objComedien3[i][0]
        objComedien3[i]= Object.assign({}, data);
        i++;
      }
      return objComedien3;
1 голос
/ 17 июня 2019

Я знаю, что есть уже принятый ответ, но чтобы сделать это правильно, вы должны получить общий результат, а затем обработать его.

const dataset = await app.models.cm_comediens_extraits_mp3.find(
    { where: { idMedia: {inq: bc} } }//which gets all the media
).then((data)=>{//it is an array already
    return data.reduce((p,c)=>{
        p[c.idSon] = c;//or c.__data if you want the data. Or Object.assign
        return p;
    },{})
})

Таким образом, вы не будете запрашивать каждый раз.

0 голосов
/ 17 июня 2019
 for (let t of test) {

    //replace your "0" with new "idSon"

    t["idSon"] = t["0"];

    //delete your "0" property object

    delete t["0"];

}

//filter based on Id in this example I Used 33275

let filteredData: any = test.filter((o: any) => o["idSon"].idSon == 33275);
0 голосов
/ 17 июня 2019

Вы можете сделать это, используя object вместо array, что позволяет вам ввести ключ idSon в качестве квалификатора вместо индекса в array:

let objComedien3 = {};

for (var prop in bc) {
  let result = await app.models.cm_comediens_extraits_mp3.find({ where: { idMedia: bc[prop]} } );
  let clonedResult = Object.assign({}, result[0]);
  objComedien3[clonedResult.idSon] = clonedResult;
}

return objComedien3;
...