Как вернуть null в Array.reduce ()? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть массив, который может выглядеть так. Это массив длиной c, содержащий строку или объект.

['h', 'e', {apple: 2}, 'l', 'p']

Мне нужно превратить его в это:

 [null, null, 'apple', 'apple', null, null]

Итак, я пытался использовать reduce метод и начался с превращения строк в null.

.reduce(
      (acc: Array<null | string>, val) => {
        if (typeof val === "string") return acc.concat(null);
        
        return acc.concat(val)
      },
      []
    );

он возвращает:

[null]

и я ожидал:

[null, null, {apple: 2}, null, null]

Производительность умеренно важна, Можно ли сделать что-то подобное с одним циклом по массиву без циклов for?

EDIT: извините, я сделал глупую ошибку, похоже, моя библиотека превращает его в ["он", {яблоко: 3}, "lp"].

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы можете использовать Array.prototype.flatMap -

const process = (t = []) =>
  t.flatMap
    ( v =>
        Object(v) === v
          ? Object
              .entries(v)
              .flatMap(([ s, n ]) => Array(n).fill(s))
          : [ null ]
    )

const data = 
  ['h', 'e', {apple: 2}, 'l', 'p']
  
const result =
  process(data)
  
console.log(JSON.stringify(result))
// [null,null,"apple","apple",null,null]

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

const result =
  process(['h', 'e', {apple: 2, pear: 3}, 'l', 'p', {berry: 1}])
  
console.log(JSON.stringify(result))
// [null,null,"apple","apple","pear","pear","pear",null,null,"berry"]

Array.prototype.flatMap - это просто специализированная версия Array.prototype.reduce -

Array.prototype.flatMap = function (f, context)
{ return this.reduce
    ( (r, x) => r.concat(f.call(context, x))
    , []
    )
}
0 голосов
/ 14 июля 2020

что?

const arr = ['h', 'e', {apple: 2}, 'l', 'p']

const rep = arr.reduce((a,c)=>
  {
  if (c instanceof Object)
    {
    let pair = Object.entries(c)[0]
    for (let n=0;n<pair[1];++n) a.push(pair[0])
    }
  else a.push(null)
  return a
  },[]) 

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