Supposons que nous ayons le tableau d'objets suivant (le réel a 71000 éléments, mais 4 objets suffisent pour vous donner une idée):

[
    {
        source: "France"
        target: "Morocco"
        timeN: "2008"
        valueN: "252.35"
    },
    {
        source: "France"
        target: "Morocco"
        timeN: "2009"
        valueN: "424.12"
    },
    {
        source: "France"
        target: "Morocco"
        timeN: "2010"
        valueN: "152.24"
    },
    {
        source: "France"
        target: "Morocco"
        timeN: "2011"
        valueN: "-342.19"
    }
]

Comment puis-je échanger efficacement les valeurs source et target sur le dernier objet, si valueN est négatif? Je voudrais simplement multiplier valueN par -1 ou appeler Math.abs(), puis changer également source en "Morocco" et target en target en {{X9} }.

Mise à jour

Bien que toutes les réponses soient excellentes et j'ai pris la propre par @Nina Scholz. Cependant, celui de @Emil S. Jørgensen est le plus performant, une fois suivi le temps d'exécution. Je ne sais pas pourquoi, mais il semble être plus performant si vous ne le reconvertissez pas en string, le valueN.

2
Florian 23 mai 2018 à 17:11

5 réponses

Meilleure réponse

Iterate. Vérifier. Swap. Update.

var array = [{ source: "France", target: "Morocco", timeN: "2008", valueN: "252.35" }, { source: "France", target: "Morocco", timeN: "2009", valueN: "424.12" }, { source: "France", target: "Morocco", timeN: "2010", valueN: "152.24" }, { source: "France", target: "Morocco", timeN: "2011", valueN: "-342.19" }];

array.forEach(o => {
    if (o.valueN < 0) {
        [o.source, o.target] = [o.target, o.source];
        o.valueN *= -1;
    }
});

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2
Nina Scholz 23 mai 2018 à 14:48
array.forEach(x=> {
  if(x.valueN < 0){
    [x.source, x.target] = [x.target, x.source] //swapping values between two var
    x.valueN *= -1;
  }
});

Vous pouvez essayer le code ci-dessus. Faites une boucle dans le tableau et si vous trouvez des valeurs négatives, échangez la variable et annulez la valeurN

1
Isaac 23 mai 2018 à 14:43

Retirez simplement le moins. Il n'a de toute façon aucune autre utilité dans votre code. Simple et fait le travail.

var data = [{source: "France",target: "Morocco",timeN: "2008",valueN:"252.35"},{source: "France",target: "Morocco",timeN: "2009",valueN: "424.12"},{source: "France",target: "Morocco",timeN: "2010",valueN: "152.24"},{source: "France",target: "Morocco",timeN: "2011",valueN: "-342.19"}];
    
data.forEach( e => { e.valueN = e.valueN.replace('-','');}); 
console.log(data)
0
Attersson 23 mai 2018 à 14:58

Voici une solution qui fonctionne:

let arr = [
    {
        source: "France",
        target: "Morocco",
        timeN: "2008",
        valueN: "252.35"
    },
    {
        source: "France",
        target: "Morocco",
        timeN: "2009",
        valueN: "424.12"
    },
    {
        source: "France",
        target: "Morocco",
        timeN: "2010",
        valueN: "152.24"
    },
    {
        source: "France",
        target: "Morocco",
        timeN: "2011",
        valueN: "-342.19"
    }
]



for (let el of arr) {


	if(parseInt(el.valueN) > 0) {
  	continue;
	}
  
  let source = el.source;
  let target = el.target;
  
  el.target = source;
  el.source = target;
  
  el.valueN = (el.valueN * -1).toString();
}

console.log(arr);

J'espère que cela vous sera utile. Si vous ne comprenez pas une partie spécifique, vous pouvez me poser des questions à ce sujet.

1
Willem van der Veen 23 mai 2018 à 14:38

Mappage du tableau avec un appel à parseFloat et Math.abs semble le solution la plus simple:

var data = [{
    source: "France",
    target: "Morocco",
    timeN: "2008",
    valueN: "252.35"
  },
  {
    source: "France",
    target: "Morocco",
    timeN: "2009",
    valueN: "424.12"
  },
  {
    source: "France",
    target: "Morocco",
    timeN: "2010",
    valueN: "152.24"
  },
  {
    source: "France",
    target: "Morocco",
    timeN: "2011",
    valueN: "-342.19"
  }
];
//Fix data by remapping values
data.forEach(function (entry) {
    var floatingValue = parseFloat(entry.valueN);
    entry.valueN = Math.abs(floatingValue);
    if (floatingValue < 0) {
        //Flipping
        var temp = entry.source;
        entry.source = entry.target;
        entry.target = temp;
    }
});
console.log(data);
2
Emil S. Jørgensen 23 mai 2018 à 14:40