Объединить свойства объекта и назначить свойства одного и того же имени с разными именами - PullRequest
0 голосов
/ 21 мая 2018

У меня есть массив с символами, имена которых иногда дублируются.Их братья и сестры - это разные рынки a, b, c .... Теперь мне нужно объединить все дубликаты символов и присоединить к ним рынки.

const theArray = [
      {
        "symbol": "CAT",
        "market_a": "20"
      },
      {
        "symbol": "DOG",
        "market_a": "40"
      },
      {
        "symbol": "DUCK",
        "market_a": "15"
      },
      {
        "symbol": "CAT",
        "market_b": "60"
      },
      {
        "symbol": "DOG",
        "market_b": "55"
      },
      {
        "symbol": "FISH",
        "market_b": "40"
      },
      {
        "symbol": "CAT",
        "market_c": "65"
      },
      {
        "symbol": "DOG",
        "market_c": "20"
      },
      {
        "symbol": "FISH",
        "market_c": "70"
      }
]

и т. Д.

Этоследует объединить так:

{
  "symbol": "CAT",
  "market_a: "20",
  "market_b: "60",
  "market_c: "65"
},
{
  "symbol": "DOG",
  "market_a": "40",
  "market_b": "55",
  "market_c": "20",
},
{
  "symbol": "FISH",
  "market_b": "40",
  "market_c": "70"
}

и т. д.

Что я пробовал до сих пор:

function groupBy(arr, p) {
  return arr.reduce(function (acc, obj) {
    var key = obj[p];
    if (!acc[key]) {
      acc[key] = [];
    }
    acc[key].push(obj);
    return acc;
  }, {});
}

var final = groupBy(theArray, 'symbol');

console.log(final)

Я также хотел бы изучить некоторые практики ES6 / стрелкаиспользование функции, так как я хочу использовать это в React для вывода JSX внутри строк таблицы.например:

var market = formattedArray.map((i, k) => {
      return (
        <tr key={k}>
          <td className="td-symbol">{i.symbol}</td>
          <td className="td-price">{i.market_a}</td>
          <td className="td-price">{i.market_b}</td>
          <td className="td-price">{i.market_c}</td>
        </tr>
      )
    })

Ответы [ 4 ]

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

Попробуйте следовать

var arr = [{ "symbol": "CAT", "market_a": "20" }, { "symbol": "DOG", "market_a": "40" }, { "symbol": "DUCK", "market_a": "15" }, { "symbol": "CAT", "market_b": "60" }, { "symbol": "DOG", "market_b": "55" }, { "symbol": "FISH", "market_b": "40" }, { "symbol": "CAT", "market_c": "65" }, { "symbol": "DOG", "market_c": "20" }, { "symbol": "fISH", "market_c": "70" }];
  
  // Reduce your array into an object with key being symbol and value being the object required
  var map = arr.reduce((a,{symbol, ...obj}) => {
  a[symbol] = a[symbol] || {symbol};
  Object.assign(a[symbol], obj); // append the remaining properties
  return a;
  }, {});
console.log(Object.values(map));

Для справки: Object.assign , Array.reduce и Object.values ​​

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

var a = [{
        "symbol": "CAT",
        "market_a": "20"
    },
    {
        "symbol": "DOG",
        "market_a": "40"
    },
    {
        "symbol": "DUCK",
        "market_a": "15"
    },
    {
        "symbol": "CAT",
        "market_b": "60"
    },
    {
        "symbol": "DOG",
        "market_b": "55"
    },
    {
        "symbol": "FISH",
        "market_b": "40"
    },
    {
        "symbol": "CAT",
        "market_c": "65"
    },
    {
        "symbol": "DOG",
        "market_c": "20"
    },
    {
        "symbol": "fISH",
        "market_c": "70"
    }
];

var result = {};
a.forEach(val => {
    result[val.symbol] = result[val.symbol] || {};
    result[val.symbol] = { ...result[val.symbol],
        ...val
    };
});
result = Object.values(result);
console.log(result);
0 голосов
/ 21 мая 2018

Ты почти рядом.Вам просто нужно использовать метод Object.assign, чтобы объединить properties.

let arr = [{ "symbol": "CAT", "market_a": "20" }, { "symbol": "DOG", "market_a": "40" }, { "symbol": "DUCK", "market_a": "15" }, { "symbol": "CAT", "market_b": "60" }, { "symbol": "DOG", "market_b": "55" }, { "symbol": "FISH", "market_b": "40" }, { "symbol": "CAT", "market_c": "65" }, { "symbol": "DOG", "market_c": "20" }, { "symbol": "fISH", "market_c": "70" }]
  
function groupBy(arr, p) {
  return arr.reduce(function (acc, obj) {
    var key = obj[p];
    if (!acc[key]) {
      acc[key] = {};
    }
    acc[key] = Object.assign(acc[key], obj);
    return acc;
  }, {});
}

var final = groupBy(arr, 'symbol');

console.log(final)
0 голосов
/ 21 мая 2018
 function mergeBy(arr, key) {
   const result = [], hash = {};
   for(const {[key]: id, ...rest} of arr) {
     if(!hash[id]) result.push(hash[id] = {[key]: id});
     Object.assign(hash[id], rest);
  }
 return result;
}

Просто используйте Object.assign для объединения объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...