Как отобразить элементы без неопределенного значения в javascript с Array.prototype.map и без Array.prototype.filter () - PullRequest
0 голосов
/ 02 июля 2019

Как отобразить элементы без неопределенного значения в javascript с Array.prototype.map и без Array.prototype.filter ()

Код:

var testArray = [
  {
    name: "toto",
    totoNumber: "1",
  },
  {
    name: "tata",
    totoNumber: "2",
  },
  {
    mame: "error",
  },
]

var listOfToto = testArray.map(x => x.totoNumber);
var listOfToto2 = testArray.map(x => x.totoNumber ? x.totoNumber : undefined);
var listOfToto3 = testArray.filter(x => x.totoNumber).map(x => x.totoNumber);

console.log(listOfToto);  
console.log(listOfToto2);  
console.log(listOfToto3);  

Значения:

Array ["1", "2", undefined]
Массив ["1", "2", не определено]
Array ["1", "2"]

Я хочу получить последний массив (["1", "2"]) без использования Array.prototype.filter ()
(может быть с чем-то другим, чем Array.prototype.map () )

Другой источник:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
Почему функция карты JavaScript возвращает undefined?
https://codewithhugo.com/avoiding-falsy-values-in-javascript-arrays/

Ответы [ 3 ]

0 голосов
/ 02 июля 2019

Вы можете использовать Array.flatMap() и вернуть пустой массив [], если значение не существует:

const testArray = [{"name":"toto","totoNumber":"1"},{"name":"tata","totoNumber":"2"},{"mame":"error"}]

const listOfToto2 = testArray.flatMap(x => x.totoNumber ? x.totoNumber : []);

console.log(listOfToto2);  
0 голосов
/ 03 июля 2019

Вот несколько вариантов, которые вы можете рассмотреть, для которых требуется один цикл.

var arr = [ { name: "toto", totoNumber: "1", }, { name: "tata", totoNumber: "2", }, { mame: "error", }, ]

// via Array.forEach
let fe = []
arr.forEach(({totoNumber}) => totoNumber ? fe.push(totoNumber) : 0)

// via Array.reduce
let r = arr.reduce((acc,{totoNumber}) => (totoNumber ? acc.push(totoNumber) : 0, acc), [])

// via Array.map acting like Array.forEach 
let m = []
arr.map(({totoNumber}) => (totoNumber ? m.push(totoNumber) : 0, totoNumber))

console.log(fe)
console.log(r)
console.log(m)

В действительности только Array.reduce имеет смысл, и обычный способ обработки вашего сценария будет через Array.filter, а затем Array.map, но так как вы спросили, можете ли выделать это только с map ... вы могли бы, но map должен возвращать точно такой же длины массива , так что это не совсем подходящее совпадение.

0 голосов
/ 02 июля 2019

Вы можете использовать reduce.

let data = testArray.reduce((result, item) => item.totoNumber ? result.concat(item.totoNumber) : result, []);

// Or a slightly more efficient solution
// if you are worried about concat creating a new temporary array at each iteration

let data = testArray.reduce((result, item) => {
    if (item.totoNumber) {
        result.push(item.totoNumber);
    }
    return result;
}, []);

Но почему вы хотите избежать filter? Это делает код намного более читабельным (по моему мнению), и если вы не имеете дело с огромным массивом или не работаете с очень чувствительной ко времени функцией, это будет микрооптимизация, ради которой вы не должны жертвовать ясностью.

На мой взгляд, это выглядит намного чище:

let data = testArray.map(item => item.totoNumber).filter(e => e);
...