Voici ce que j'ai: je veux fusionner l'objet dont la clé commence par "chemin -" + i. Et pour supprimer "path-i" des clés dans le résultat final.

  var arr = [
  {
    "key": "path-0-mp4",
    "value": [
      "media/video/01.mp4",
      "media/video/01_hd.mp4"
    ]
  },
  {
    "key": "path-0-quality",
    "value": [
      "720p",
      "1080p"
    ]
  },
  {
    "key": "path-1-mp4",
    "value": [
      "media/video/02.mp4",
      "media/video/02_hd.mp4"
    ]
  },
  {
    "key": "path-1-quality",
    "value": [
      "SD",
      "HD"
    ]
  }

]

C'est un résultat souhaité:

 var arr = [
        [
              {
                "mp4": "media/video/01.mp4",
                "quality": "720p"
              },
              {
                "mp4": "media/video/01_hd.mp4",
                "quality": "1080p"
              },
        ],
        [
              {
                "mp4": "media/video/02.mp4",
                "quality": "SD"
              },
              {
                "mp4": "media/video/02_hd.mp4",
                "quality": "HD"
              },
        ],
]

J'ai commencé à faire quelque chose mais ce n'est même pas proche:

var key, new_key, value,j=0, z=0, parr = [], obj;
for(var i = 0;i<a.length;i++){
    console.log('item:' ,a[i])
    key = a[i].key, value = a[i].value
    if(key.indexOf('path-'+j.toString()) > -1){
        new_key = key.substr(key.lastIndexOf('-')+1)
        console.log(key, new_key, value)
        for(var z = 0;z<value.length;z++){
            parr.push({[new_key]: value[z] })
        }
    }
}

console.log(parr)

[
  {
    "mp4": "media/video/01.mp4"
  },
  {
    "mp4": "media/video/01_hd.mp4"
  },
  {
    "quality": "720p"
  },
  {
    "quality": "1080p"
  }
]
3
Toniq 8 avril 2020 à 15:14

4 réponses

Je trouve cela plus facile à lire et à saisir

Vous pouvez enregistrer une affectation si vous utilisez réduire

const arr = [{ "key": "path-0-mp4", "value": [ "media/video/01.mp4", "media/video/01_hd.mp4" ] }, { "key": "path-0-quality", "value": [ "720p", "1080p" ] }, { "key": "path-1-mp4", "value": [ "media/video/02.mp4", "media/video/02_hd.mp4" ] }, { "key": "path-1-quality", "value": [ "SD", "HD" ] } ];

newArr = [];
arr.filter(item => item.key.endsWith("mp4"))
     .forEach(item => item.value
       .forEach((val, i) => newArr.push({
          "mp4": val, 
      "quality": arr.find(qItem => qItem.key === item.key.replace("mp4", "quality")).value[i]}
     )
   )
 )

console.log(newArr)

Voici la version de Nina dans une version discrète

var data = [{ key: "path-0-mp4", value: ["media/video/01.mp4", "media/video/01_hd.mp4"] }, { key: "path-0-quality", value: ["720p", "1080p"] }, { key: "path-1-mp4", value: ["media/video/02.mp4", "media/video/02_hd.mp4"] }, { key: "path-1-quality", value: ["SD", "HD"] }],

  result = data.reduce((resultArray, { key, value }) => {
        let [, idx, suffix] = key.split('-');
        resultArray[idx] = resultArray[idx] || [];
        value.forEach((val, i) => (resultArray[idx][i] = resultArray[idx][i] || {})[suffix] = val);
        return resultArray;
    }, []);

console.log(result);
1
mplungjan 8 avril 2020 à 13:39

La seule chose étrange que j'ai faite ici était d'utiliser un objet comme table de recherche pour aider à la complexité de la vitesse. Si vous avez des questions dites le moi.

const arr = [{ "key": "path-0-mp4", "value": [ "media/video/01.mp4", "media/video/01_hd.mp4" ] }, { "key": "path-0-quality", "value": [ "720p", "1080p" ] }, { "key": "path-1-mp4", "value": [ "media/video/02.mp4", "media/video/02_hd.mp4" ] }, { "key": "path-1-quality", "value": [ "SD", "HD" ] } ];


const result = arr.reduce((table, item) => {
  // Getting "path-1" from "path-1-quality" 
  const pathValues = item.key.split('-');
  const pathValue = pathValues[0] + '-' + pathValues[1];
  // Getting "quality" from "path-1-quality" 
  const key = pathValues[2];
  
  // Get Index from table if already registered paths
  let tIndex = table.indexLookup[pathValue]; 
  
  // If there is no registered index register one
  if (tIndex === undefined) {
    // reassign index to new location
    tIndex = table.result.length;
    // register the index
    table.indexLookup[pathValue] = tIndex;
    table.result.push([]);
  }
  
  // Assign values
  item.value.forEach((value, i) => {
  	const arr = table.result[tIndex] || [];
    arr[i] = arr[i] || {}
    arr[i][key] = value;
    table.result[tIndex] = arr;
  })
  return table
}, {
  indexLookup : {},
  result: []
}).result


console.log(result)
0
Michael Warner 8 avril 2020 à 13:48

Je suis nouveau dans ce domaine et débutant, est-ce la bonne approche?

const a = [{ "key": "path-0-mp4", "value": [ "media/video/01.mp4", "media/video/01_hd.mp4" ] }, { "key": "path-0-quality", "value": [ "720p", "1080p" ] }, { "key": "path-1-mp4", "value": [ "media/video/02.mp4", "media/video/02_hd.mp4" ] }, { "key": "path-1-quality", "value": [ "SD", "HD" ] } ];

var resp = [];
for (let i = 0; i < a.length; i++) {
  var inst = a[i];
  var key = inst["key"];
  for (let j = 0; j < inst.value.length; j++) {
    var index = key.split("-")[1];
    var keyinst = key.split("-")[2];
    if (!resp[index]) {
      resp[index] = [];
    }
    if (!resp[index][j]) {
      resp[index][j] = {};
    }
    resp[index][j][keyinst] = inst.value[j];
  }
}
console.log(resp);
1
mplungjan 8 avril 2020 à 13:07

Vous pouvez diviser la propriété key, omettre la première path et prendre le reste comme index et clé. Créez ensuite un nouveau tableau, s'il n'existe pas, et affectez les valeurs.

var data = [{ key: "path-0-mp4", value: ["media/video/01.mp4", "media/video/01_hd.mp4"] }, { key: "path-0-quality", value: ["720p", "1080p"] }, { key: "path-1-mp4", value: ["media/video/02.mp4", "media/video/02_hd.mp4"] }, { key: "path-1-quality", value: ["SD", "HD"] }],
    result = data.reduce((r, { key, value }) => {
        let [, i, k] = key.split('-');
        r[i] = r[i] || [];
        value.forEach((v, j) => (r[i][j] = r[i][j] || {})[k] = v);
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2
Nina Scholz 8 avril 2020 à 12:26