Как конвертировать этот массив объектов, чтобы использовать уменьшить JavaScript - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь преобразовать эту функцию, чтобы уменьшить.Я на полпути.Когда выбрано значение true, я хочу знать индекс этого элемента.

let options = [
    {label: 'foo1', selected: false},
    {label: 'foo2', selected: true},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
];
const obj = options
              .map((option, index) => (option.selected ? index : -1))
              .filter((val) => val !== -1)[0];

Результат: 1

Моя попытка такова:

const obj = options.reduce((acc, currentValue, index) => {
    const i = currentValue["selected"] ? index : -1;
    return acc.concat(i)
}, []); // [-1,1,-1,-1,-1]

Как мне изменить всю вещь, чтобы использовать сокращение?

Ответы [ 5 ]

0 голосов
/ 10 февраля 2019

Другим способом является использование push вместо concat:

let options = [
    {label: 'foo1', selected: false},
    {label: 'foo2', selected: true},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
];

var obj = options.reduce( (acc, currentValue, index) => {
    currentValue.selected ? acc.push(index) : ''; return acc} ,[] ) ;

console.log(obj)
0 голосов
/ 10 февраля 2019

Используйте троицу в concat(), чтобы установить значение для вставки.Array#concat() возвращает обновленный массив, что является возвращением для reduce().

Или используйте распространение для возврата нового массива [...accumulator, selsected ? i :-1]

const res = options.reduce((a, {selected:s}, i) =>  a.concat(s ? i : -1) , []);

// OR
// const res = options.reduce((a, {selected:s}, i) =>  [....a,s ? i : -1] , []);

console.log(res)
<script>

let options = [
    {label: 'foo1', selected: false},
    {label: 'foo2', selected: true},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
];

</script>
0 голосов
/ 10 февраля 2019

Добавлять индекс к результату, только если option.selected истинно, иначе ничего не делать.

let options = [
    {label: 'foo1', selected: false},
    {label: 'foo2', selected: true},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
];

const selected = options.reduce((arr, option, index) => {
  return option.selected ? arr.concat(index) : arr; 
}, []);

console.log(selected);
0 голосов
/ 10 февраля 2019

Используя Array#reduce и оператор распространения ..., сохраните существующие индексы и добавьте новый индекс, если selected равно true.

let options = [
    {label: 'foo1', selected: false},
    {label: 'foo2', selected: true},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: true},
    {label: 'foo2', selected: 1}
];

const obj = options.reduce((acc, currentValue, index) => {
    // checking only for boolean true not for truthy values
    return acc = currentValue["selected"] === true ? [...acc, index] : acc;
}, []); 
console.log(obj); 
0 голосов
/ 10 февраля 2019

Если вам нужны индексы с selected = true, то вы можете сделать что-то подобное, используя reduce.Если текущий элемент в контексте имеет значение selected === true, добавьте индекс в аккумулятор, иначе верните аккумулятор.В настоящее время вы добавляете -1, если условие false

let options = [
    {label: 'foo1', selected: false},
    {label: 'foo2', selected: true},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
    {label: 'foo2', selected: false},
];

const selectedIndexes = options.reduce((r, o, i) => o.selected ? r.concat(i) : r, [])
console.log(selectedIndexes)

Если вам нужен весь объект, вы можете просто использовать filter:

let options = [{label:'foo1',selected:false},{label:'foo2',selected:true},{label:'foo2',selected:false},{label:'foo2',selected:false},{label:'foo2',selected:false},];

const filtered = options.filter(o => o.selected)
console.log(filtered)
...