Mam następującą strukturę:

const array = [
  [
    [
      [
        [
          {
            'name':'John'
          }
        ],
        {
          'name':'Mary'
        }
      ],
      {
        'name':'Cris'
      }
    ],
    {
      'name':'Deen'
    }
  ],
  {
    'name':'Bob'
  }
]

I chciałbym uzyskać następującą strukturę w wyniku:

const expect = [
  {
    'name':'John'
  },
  {
    'name':'Mary'
  },
  {
    'name':'Cris'
  },
  {
    'name':'Deen'
  },
  {
    'name':'Bob'
  },
]

Jak zrobić taką konwersję z lodash lub inną biblioteką?

-1
aloebys 24 czerwiec 2017, 21:28

8 odpowiedzi

Najlepsza odpowiedź

Możesz użyć _.flattenDeep z Lodash:

Rekurencyjnie spłaszcza tablicę.

const array = [[[[[{ name: 'John' }], { name: 'Mary' }], { name: 'Cris' }], { name: 'Deen' }], { name: 'Bob' }];
    
console.log(_.flattenDeep(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
1
Nina Scholz 24 czerwiec 2017, 18:32

Optymalny sposób bez żadnej biblioteki i za pomocą dobranej logiki JS:

var arr = [
  [
    [
      [
        [
          {
            'name':'John'
          }
        ],
        {
          'name':'Mary'
        }
      ],
      {
        'name':'Cris'
      }
    ],
    {
      'name':'Deen'
    }
  ],
  {
    'name':'Bob'
  }
];

// convert to string and remove all Array "[" and "]" symbols
var str = JSON.stringify(arr).replace(/\[|]/g,'');
// convert the String back to an Object (Array)
var flatArr = JSON.parse("[" + str + "]");

console.log(flatArr)
0
Community 20 czerwiec 2020, 09:12

Możesz to zrobić z zamknięciami i pojedynczą linią kodu z ES6. Biblioteki, gdy nie jest konieczne, są obciążeniem. Unikaj ich tam, gdzie możesz.

const flatten = arr => arr.reduce((r, e) => (r = r.concat(Array.isArray(e) ? flatten(e) : e), r), []);

const array = [
  [
    [
      [
        [{
          'name': 'John'
        }],
        {
          'name': 'Mary'
        }
      ],
      {
        'name': 'Cris'
      }
    ],
    {
      'name': 'Deen'
    }
  ],
  {
    'name': 'Bob'
  }
];
console.log(flatten(array))
0
Rick 24 czerwiec 2017, 20:56

Pure ES6 i dopasowywanie wzorców Haskelesque wdrażane przez destrukturkowanie, możesz po prostu zrobić w następujący sposób;

function flat([a,...b]){
  return (Array.isArray(a) ? flat(a) : [a]).concat(b.length ? flat(b) : []);
}

var arr = [[[[[{"name":"John"}],{"name":"Mary"}],{"name":"Cris"}],{"name":"Deen"}],{"name":"Bob"}],
    res = flat(arr);
console.log(res);
0
Redu 24 czerwiec 2017, 18:53
function flattenArray(array, result) {
    result = result || [];
    for (var i = 0; i < array.length; i++) {
        if (Array.isArray(array[i])) {
            flattenArray(array[i], result);
        } else {
            result.push(array[i]);
        }
    }

    return result;
}

Napisałem to trochę czasu. Podąża za rekurencyjnym podejściem i jest naprawdę szybki.

JSPERF: https://jsperf.com/Flatten-array-r1

0
gauravmuk 24 czerwiec 2017, 18:40

Możesz użyć tego pakietu NPM NPM podkreślenia i jest to prosty przykład: var _ = require('underscore-node'); var extractedArray = _.flatten(deepArray)

1
Ninja 24 czerwiec 2017, 18:42

Możesz tworzyć funkcję rekurencyjną za pomocą reduce(), aby zwrócić pożądany wynik.

const array = [[[[[{"name":"John"}],{"name":"Mary"}],{"name":"Cris"}],{"name":"Deen"}],{"name":"Bob"}]

function flatten(arr) {
  return arr.reduce(function(r, e) {
     return r = r.concat(Array.isArray(e) ? flatten(e) : e), r
  }, [])
}

console.log(flatten(array))
1
Nenad Vracar 24 czerwiec 2017, 18:33

Rozważmy za pomocą Skanowanie obiektów. Jest potężny do robienia w przetwarzaniu struktury danych pamięci (po zakończeniu głowy wokół niego).

Oto jak mógłbyś rozwiązać swój przykład

// const objectScan = require('object-scan');

const find = (input) => objectScan(['**'], {
  reverse: false,
  rtn: 'value',
  filterFn: ({ value }) => typeof value.name === 'string'
})(input);

const array = [[[[[{ name: 'John' }], { name: 'Mary' }], { name: 'Cris' }], { name: 'Deen' }], { name: 'Bob' }];

console.log(find(array));
// => [ { name: 'John' }, { name: 'Mary' }, { name: 'Cris' }, { name: 'Deen' }, { name: 'Bob' } ]
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.8.0"></script>

Zastrzeżenie : jestem autorem skanowania obiektów

0
vincent 15 styczeń 2021, 03:36