【问题标题】:Efficient way to swap property values in array of objects在对象数组中交换属性值的有效方法
【发布时间】:2018-11-02 13:49:25
【问题描述】:

假设我们有如下的 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,它似乎性能最高。

【问题讨论】:

  • 在这种情况下,关于翻转最后一个对象的部分只是一个例子吗?更清楚地说,您是否希望将此翻转方法应用于数组中具有负值valueN 的任何 71,000 个对象,或者您是否总是想要翻转最终对象(即array[array.length - 1] 中的对象)?.. .
  • 为什么只有最后一个对象?请添加 flipping 想要的结果。
  • 您希望源和目标相互切换?
  • @WillemvanderVeen:我相信只有valueN是-ve
  • @Florian 提问时,请停留几分钟,以便您澄清评论中出现的问题和问题。您的帖子已经有 5 个答案,其中 2 个已删除,但试图帮助您的人仍在猜测您想要的结果是什么。投票结束时不清楚

标签: javascript arrays object flip


【解决方案1】:

通过调用parseFloatMath.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);

【讨论】:

  • map 是真的克隆对象还是会修改原始数组的对象?
  • 这是部分正确的。如果条件值 N
  • @ManuelOtto 对象是通过引用传递的,所以这个方法改变了原来的数组对象。
  • @War10ck 我已经相应地更改了我的 sn-p。
  • @EmilS.Jørgensen 完美! +1
【解决方案2】:
array.forEach(x=> {
  if(x.valueN < 0){
    [x.source, x.target] = [x.target, x.source] //swapping values between two var
    x.valueN *= -1;
  }
});

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

【讨论】:

  • 是的,这是一个很好的解决方案。我认为这与@Nina Scholz 的相似。我不知道使用这种表示法在对象属性之间交换值可以那么容易。
  • @Florian:它被称为Destructuring Assignment Array Matching
  • @Florian: 只是一个建议,作为感谢,如果你觉得它们有帮助,你可以投票赞成:)
  • 啊,我知道破坏。不过不知道这个套路。我现在明白了。
【解决方案3】:

这是一个可行的解决方案:

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

希望这对您有所帮助。如果您不了解特定部分,可以进一步询问我。

【讨论】:

  • 哇也非常感谢!我也很喜欢这个主意。对于大型数据集,我将尝试哪种解决方案更快。你的或@Nina Scholz 的。无论如何,谢谢!
【解决方案4】:

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

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)

【讨论】:

    【解决方案5】:

    IterateCheckSwapUpdate.

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

    【讨论】:

    • 哇!!非常感谢您的快速回复和出色的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多