2017-02-07 5 views
0

У меня есть некоторые данные:Используя карту() и/или уменьшить(), чтобы упростить Foreach() заявление в узле (или родной JavaScript)

var rows = [{ 
    name: "name1", 
    description: "description1", 
    value: 101 
}, { 
    name: "name2", 
    description: "description2", 
    value: 202 
}] 

чисто для удовольствия, я хотел бы превратите это в матрицу объектных ключей, содержащих массивы совпадающих точек данных. Вот один вкладыш я начала работать, используя forEach():

var o = {} 
rows.forEach(row => Object.keys(row).forEach(key => (o[key] === undefined) ? o[key] = [row[key]] : o[key].push(row[key]))) 

console.log(o) 

/* 
{ 
    name: ['name1', 'name2'], 
    description: ['description1', 'description2'], 
    value: [101, 202] 
} 
*/ 

У меня есть чувство, что я могу еще сократить это выражение с помощью map() и/или reduce(), но я до сих пор полностью загнаны в угол!

Также предположим, что ключи согласованы, но не всегда известны.

+0

не будет значительно упрощать его ... все равно нужно перебирать все ключи объектов даже в 'reduce()' – charlietfl

+0

. Хорошо, упростить - это плохое слово. Сокращение - это лучшее. – brandonscript

ответ

1

Если ключи последовательны, вы можете сделать STH как:

var matrix = Object.keys(rows[0]).reduce((o, key) => (o[key] = rows.map(row => row[key]), o), {}); 
+0

NICE! Супер гладкий. – brandonscript

1

Вы можете использовать Array#reduce с коротким вырезом для проверки наличия собственности.

var rows = [{ name: "name1", description: "description1", value: 101 }, { name: "name2", description: "description2", value: 202 }], 
 
    obj = rows.reduce(
 
     (o, row) => (
 
      Object.keys(row).forEach(key => (o[key] = o[key] || []).push(row[key])), 
 
      o 
 
     ), 
 
     {} 
 
    ); 
 

 
console.log(obj);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Пока это выглядит как лучший ответ. Я действительно не вижу, как мы могли бы стать более краткими, чем это! Спасибо Нине. – brandonscript

1

Использование lodash вы можете сделать это с

var rows = [{ 
 
    name: "name1", 
 
    description: "description1", 
 
    value: 101 
 
}, { 
 
    name: "name2", 
 
    description: "description2", 
 
    value: 202 
 
}]; 
 
  
 
var combined = _.mergeWith(...rows, (o, s) => _.castArray(o).concat(_.castArray(s))); 
 

 
console.log(combined);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>