交换对象数组中 属性 值的有效方法

Efficient way to swap property values in array of objects

假设我们有以下对象数组(实际有 71000 个元素,但 4 个对象足以让您了解):

[
    {
        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"
    }
]

如果 valueN 为负,我如何有效地交换最后一个对象的 sourcetarget 值?我只想将 valueN-1 相乘或调用 Math.abs() 然后将 source 更改为 "Morocco" 并将 target 更改为 "France".

更新

虽然所有答案都很棒,但我已经采用了@Nina Scholz 的干净答案。然而,@Emil S. Jørgensen 的那个是性能最高的,一旦跟踪执行时间。我不知道为什么,但如果不将其转换回 stringvalueN.

,它似乎是最高效的

通过调用 parseFloat and Math.abs 映射数组似乎是最简单的解决方案:

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);

array.forEach(x=> {
  if(x.valueN < 0){
    [x.source, x.target] = [x.target, x.source] //swapping values between two var
    x.valueN *= -1;
  }
});

你可以试试上面的代码。遍历数组,如果找到负值,交换变量并取反 valueN

这是一个有效的解决方案:

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);

希望这对您有所帮助。如果你不明白具体的部分,你可以进一步问我。

只需删除减号。无论如何,如果在您的代码中没有其他用途。简单并完成工作。

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)

Iterate. Check. 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; }