Arhn - архитектура программирования

Деструктуризация в сочетании с функциями массива

Просто интересно, можно ли использовать функцию массива (например, фильтр) для одновременного возврата как отрицательных, так и положительных результатов оператора с использованием деструктурирования.

Что-то вроде следующего:

let {truthys, falsys} = arr.filter(a => {
   return //magical statement that returns truthy's and falsy's?
}); 

вместо:

let truthys = arr.filter(item => item.isTruthy);
let falsys = arr.filter(item => !item.isTruthy);

Так что что-то вроде сокращенного способа сделать последнее. Кажется, нигде не могу найти ничего об этом, так что это может быть вообще невозможно. Спасибо!


  • Вы можете использовать .reduce() для создания объекта с двумя массивами. 11.06.2021
  • .filter() возвращает один массив значений. Нет особого смысла деструктурировать его, если вы передаете предикат. Что вы можете сделать, так это группировать по результату предиката и вернуть объект с { "true" : /* items that passed the predicate test */, "false": /* items that did not pass the predicate test */ }, а затем деструктурировать как const {true: truthys, false: falsys} = groupedValues 11.06.2021
  • Спасибо! Попробую оба :) 11.06.2021
  • См. реализация partition georg здесь, это, по сути, то, что вам нужно. Вы бы назвали это как parition(arr, x => !!x) (или parition(arr, Boolean), если хотите). Это разделение на массив с индексами 1 и 0, но подход тот же, если вы хотите разделить на объект с ключами true и false. Я лично предпочитаю последнее, потому что немного яснее, что result.true является результатом всего, где условие вернуло true, но в конечном итоге не имеет большого значения. 11.06.2021
  • const [thruthys, falsys] = partition(arr, item => item.isTruthy) с соответствующей вспомогательной функцией (см. дубликаты) является стандартным подходом. Если у вас уже есть помощник groupBy, например помощник lodash, вы также можете использовать const {true: truthys, false: falsys} = _.groupBy(arr, item => !!item.isTruthy). 11.06.2021

Ответы:


1

Ваша идея никогда не будет работать так, как написано, потому что возврат из filter обязательно будет массивом, а не структурой. Если вы не против просто найти одно значение, этот вариант работает:

{ a, b } = [ { a: 'yyy', b: 'yzz' }, { a: 'aww', b: 'azz' } ].find(e => e.a.startsWith('y'))

> a
'yyy'
> b
'yzz'

Но, присмотревшись повнимательнее, я вижу, что вы на самом деле хотели, так что, пожалуй, самое простое:

> a = [ '', ' hello ', ' ', false, [], [0], [''], [' '], null, undefined, new Array(), 0, 1, -1 ]
[
  '',     ' hello ',
  ' ',    false,
  [],     [ 0 ],
  [ '' ], [ ' ' ],
  null,   undefined,
  [],     0,
  1,      -1
]

> { truthish, falsish } = { truthish: a.filter(e => !!e), falsish: a.filter(e => !e) }
{
  truthish: [ ' hello ', ' ', [], [ 0 ], [ '' ], [ ' ' ], [], 1, -1 ],
  falsish: [ '', false, null, undefined, 0 ]
}
11.06.2021
  • Просто немного забавы: 0 ложно, но new Number(0) правдиво, но Number(0) ложно. 11.06.2021

  • 2

    Вы можете использовать .reduce для этого:

    const getTruthysAndFalsys = (array) => {
      return array.reduce(
        ({ truthys, falsys }, item) => {
          const isTruthy = item.isTruthy
    
          return {
            truthys: [
              ...truthys,
              ...(isTruthy ? [item] : []),
            ],
            falsys: [
              ...falsys,
              ...(!isTruthy ? [item] : []),
            ],
          }
        },
        { truthys: [], falsys: [] }
      )
    }
    
    const array = [
      { name: 'Item 1', isTruthy: true },
      { name: 'Item 2', isTruthy: true },
      { name: 'Item 3', isTruthy: false },
      { name: 'Item 4', isTruthy: true },
      { name: 'Item 4', isTruthy: false },
    ]
    
    
    getTruthysAndFalsys(array)
    // { 
    //   truthys: [ 
    //     { name: 'Item 1', isTruthy: true }, 
    //     { name: 'Item 2', isTruthy: true }, 
    //     { name: 'Item 4', isTruthy: true }, 
    //   ], 
    //   falsys: [ 
    //     { name: 'Item 3', isTruthy: false }, 
    //     { name: 'Item 4', isTruthy: false },
    //   ],
    // } 
    
    11.06.2021

    3

    Как предложил @Pointy, вы можете избежать двухкратной фильтрации, разделив элементы на два массива с помощью Array.prototype.reduce() следующим образом:

    const input = [1, 0, true, false, "", "foo"];
    
    const [truthies, falsies] = input.reduce(
      ([truthies, falsies], cur) =>
        !cur ? [truthies, [...falsies, cur]] : [[...truthies, cur], falsies],
      [[], []]
    );
    
    console.log(truthies, falsies);

    11.06.2021
  • Вау, я повторил ответ на дубликат вопроса, даже не подозревая об этом. 11.06.2021
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..