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

Javascript 在对象数组中交换属性值的有效方法,javascript,arrays,object,flip,Javascript,Arrays,Object,Flip,假设我们有以下对象数组(real有71000个元素,但4个对象足以让您了解情况): 如果valueN为负数,如何有效地交换最后一个对象上的源和目标值?我想将valueN与-1相乘,或者调用Math.abs(),然后将source更改为“摩洛哥”,将target更改为“法国” 更新 尽管所有的答案都很好,而且我已经采纳了@Nina Scholz的干净答案。然而,来自@Emil S.Jørgensen的一个是最有表现力的一个,一旦跟踪了执行时间。我不知道为什么,但如果不将其转换回字符串,值,通过调用

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

如果
valueN
为负数,如何有效地交换最后一个对象上的
目标
值?我想将
valueN
-1相乘,或者调用
Math.abs()
,然后将
source
更改为
“摩洛哥”
,将
target
更改为
“法国”

更新
尽管所有的答案都很好,而且我已经采纳了@Nina Scholz的干净答案。然而,来自@Emil S.Jørgensen的一个是最有表现力的一个,一旦跟踪了执行时间。我不知道为什么,但如果不将其转换回
字符串
,通过调用映射数组似乎是最简单的解决方案:

var数据=[{
资料来源:“法国”,
目标:“摩洛哥”,
泰门:“2008年”,
瓦伦:“252.35”
},
{
资料来源:“法国”,
目标:“摩洛哥”,
timeN:“2009年”,
瓦伦:“424.12”
},
{
资料来源:“法国”,
目标:“摩洛哥”,
timeN:“2010年”,
瓦伦:“152.24”
},
{
资料来源:“法国”,
目标:“摩洛哥”,
timeN:“2011年”,
估价单位:“-342.19”
}
];
//通过重新映射值来修复数据
data.forEach(函数(条目){
var floatingValue=parseFloat(entry.valueN);
entry.valueN=Math.abs(floatingValue);
如果(浮动值<0){
//翻转
var temp=entry.source;
entry.source=entry.target;
entry.target=温度;
}
});
控制台日志(数据)
array.forEach(x=>{
如果(x.valueN<0){
[x.source,x.target]=[x.target,x.source]//在两个变量之间交换值
x、 数值*=-1;
}
});

您可以尝试上面的代码。循环遍历数组,如果发现负值,则交换变量并对值求反n

以下是一个有效的解决方案:

让arr=[
{
资料来源:“法国”,
目标:“摩洛哥”,
泰门:“2008年”,
瓦伦:“252.35”
},
{
资料来源:“法国”,
目标:“摩洛哥”,
timeN:“2009年”,
瓦伦:“424.12”
},
{
资料来源:“法国”,
目标:“摩洛哥”,
timeN:“2010年”,
瓦伦:“152.24”
},
{
资料来源:“法国”,
目标:“摩洛哥”,
timeN:“2011年”,
估价单位:“-342.19”
}
]
对于(让el代表arr){
如果(parseInt(el.valueN)>0){
继续;
}
设震源=el.source;
设target=el.target;
el.目标=源;
el.源=目标;
el.valueN=(el.valueN*-1).toString();
}

控制台日志(arr)只要去掉减号就行了。无论如何,If在代码中没有其他用途。简单,完成任务

var数据=[{来源:“法国”,目标:“摩洛哥”,时间:“2008”,瓦伦:“252.35”},{来源:“法国”,目标:“摩洛哥”,时间:“2009”,瓦伦:“424.12”},{来源:“法国”,目标:“摩洛哥”,时间:“2010”,瓦伦:“152.24”},{来源:“法国”,目标:“摩洛哥”,时间:“2011”,瓦伦:“342.19”};
data.forEach(e=>{e.valueN=e.valueN.replace('-','');});
console.log(数据)

var数组=[{来源:“法国”,目标:“摩洛哥”,时间:“2008”,瓦伦:“252.35”},{来源:“法国”,目标:“摩洛哥”,时间:“2009”,瓦伦:“424.12”},{来源:“法国”,目标:“摩洛哥”,时间:“2010”,瓦伦:“152.24”},{来源:“法国”,目标:“摩洛哥”,时间:“2011”,瓦伦:“342.19”};
array.forEach(o=>{
如果(o.valueN<0){
[o.source,o.target]=[o.target,o.source];
o、 数值*=-1;
}
});
console.log(数组)

.as控制台包装{max height:100%!important;top:0;}
关于翻转最后一个对象的部分只是本例中的一个示例吗?更明确地说,您是否希望将此翻转方法应用于数组中具有负
值的71000个对象中的任何一个,或者始终希望翻转最终对象(即
数组[array.length-1]
中的对象)?…为什么只翻转最后一个对象?请添加所需的翻转结果。是否希望源和目标相互切换?@WillemvanderVeen:仅当
valueN
is-ve Ibelieve@Florian提问时,请停留几分钟,以便澄清评论中出现的问题。你的帖子已经有5个答案,2个被删除,但是试图帮助你的人仍然在猜测你想要的结果是什么。投票以不清楚的方式关闭。映射是否真的克隆了对象,或者这会修改原始数组的对象?这部分是正确的。请注意,如果条件值n<0为真,则还将翻转源国家/地区和目标国家/地区。@ManuelOtto对象是通过引用传递的,因此此方法会更改原始arrays对象。@War10ck我已相应地更改了我的代码段。@EmilS.Jørgensen完美+1哇,也非常感谢您!我也很喜欢这个主意。我将尝试哪个解决方案对于大型数据集更快。你的或尼娜·斯科尔斯的。无论如何,谢谢你!是的,这是一个很好的解决方案。我认为这和尼娜·斯科尔斯的作品很相似。我不知道用这个符号在对象属性之间交换值会这么容易。@Florian:它被称为
解构赋值数组匹配
@Florian:只是一个建议,作为感谢的表示,如果你觉得答案有用,你可以对其进行投票:)啊,我知道解构。但是我不知道这个把戏。我现在明白了。哇!!非常感谢您的快速回复和出色的解决方案。非常感谢。
[
    {
        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(x=> {
  if(x.valueN < 0){
    [x.source, x.target] = [x.target, x.source] //swapping values between two var
    x.valueN *= -1;
  }
});