Эффективный способ поменять значения свойств в массиве объектов - PullRequest
0 голосов
/ 23 мая 2018

Предположим, у нас есть следующий массив объектов (в вещественном есть 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"
    }
]

Как эффективно поменять местами source и target значения последнего объекта, если valueN отрицательно?Я хотел бы просто умножить valueN на -1 или позвонить Math.abs(), а затем изменить также source на "Morocco" и target на "France".

Обновление

Хотя все ответы великолепны, и я взял чистый @Nina Scholz.Тем не менее, один из @Emil S. Jørgensen является наиболее производительным, когда отслеживает время выполнения.Я не знаю почему, но, кажется, это наиболее эффективно, если вы не преобразуете его обратно в string, valueN.

Ответы [ 5 ]

0 голосов
/ 23 мая 2018

Iterate . Проверить . Своп . Обновление .

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; }
0 голосов
/ 23 мая 2018

Просто убери минус.В любом случае, если в вашем коде нет другого использования.Просто и выполняет свою работу.

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 голосов
/ 23 мая 2018
array.forEach(x=> {
  if(x.valueN < 0){
    [x.source, x.target] = [x.target, x.source] //swapping values between two var
    x.valueN *= -1;
  }
});

Вы можете попробовать приведенный выше код.Цикл по массиву и, если найдены отрицательные значения, меняем местами переменную и обнуляем значение N

0 голосов
/ 23 мая 2018

Вот решение, которое работает:

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

Надеюсь, вы найдете это полезным.Если вы не понимаете какую-то конкретную часть, вы можете спросить меня об этом.

0 голосов
/ 23 мая 2018

Отображение массива с помощью вызова parseFloat и 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);
...