Объединить два объекта javascript, добавив значения общих свойств

У меня два или более объекта javascript. Я хочу объединить их, добавив значения общих свойств, а затем отсортировать их в порядке убывания значений.

например.

var a = {en : 5,fr: 3,in: 9}
var b = {en: 8,fr: 21,br: 8}

var c = merge(a,b)

c должно быть таким:

c = {
fr: 24,
en: 13,
in:9,
br:8
} 

т.е. оба объекта объединяются, значения общих ключей складываются, а затем ключи сортируются.

Вот что я пробовал:

var a = {en : 5,fr: 3,in: 9}
var b = {en: 8,fr: 21,br: 8}
c = {}

// copy common values and all values of a to c
for(var k in a){
  if(typeof b[k] != 'undefined'){  
    c[k] = a[k] + b[k]  
  }
  else{ c[k] = a[k]}
}

// copy remaining values of b (which were not common)
for(var k in b){
 if(typeof c[k]== 'undefined'){
  c[k] = b[k]
 }
} 

// Create a object array for sorting
var arr = [];

for(var k in c){
 arr.push({lang:k,count:c[k]})
}

// Sort object array
arr.sort(function(a, b) {
   return b.count - a.count;
})

но не думаю, что это хорошо. Так много циклов :( Было бы неплохо, если бы кто-нибудь мог предоставить менее беспорядочный и хороший код.

9
задан Jashwant 7 February 2012 в 00:44
поделиться

1 ответ

В ES2015 +, свойства объектов заказаны (сначала путем возрастания числовых ключей, затем порядком вставки на нечисловые ключи). Это гарантируется спецификацией при использовании одного из методов, для которых итеративный порядок указан (как Object.getOwnPropertyNames). Методы, для которых итеративный порядок не указан (как Object.keys и for..in), как гарантируют, не будут иметь никакого конкретного порядка, но в значительной степени все современные среды выполняют итерации в том же предсказуемом порядке так или иначе.

, Но необходимо быть уверены, что ни одно из свойств не является числовым (иначе, они будут на первом месте, перед нечисловыми свойствами, неважно, порядок вставки).

Использование reduce, чтобы выполнить итерации по каждому объекту и создать или добавить к тому же свойству на аккумуляторе. Затем sort записи объекта и использование Object.fromEntries для преобразования его в объект с отсортированными свойствами. Никакая потребность в jQuery:

var a = {en : 5,fr: 3,in: 9}
var b = {en: 8,fr: 21,br: 8}
console.log(merge(a, b));

function merge(...objects) {
  const merged = objects.reduce((a, obj) => {
    Object.entries(obj).forEach(([key, val]) => {
      a[key] = (a[key] || 0) + val;
    });
    return a;
  }, {});
  return Object.fromEntries(
    Object.entries(merged).sort(
      (a, b) => b[1] - a[1]
    )
  );
}
1
ответ дан 3 November 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: