16 Şubat 2020 Pazar

Logical Not Operator

Giriş
Javascrip'te logical not operator bir sürü durumda kullanılabilir.

Örnek
Bazı örnekler şöyle. Boş olmayan string'in sonucu false çıkar. function,array,object yine false verir.
!true         // false
!-1           // false
!"-1"         // false
!42           // false
!"42"         // false
!"foo"        // false
!"true"       // false
!"false"      // false
!{}           // false
![]           // false
!function(){} // false


!false        // true
!null         // true
!undefined    // true
!NaN          // true
!0            // true
!""           // true

11 Şubat 2020 Salı

Array reduce metodu

Giriş
İki tane parametre alır. Callback ve InitialValue. Callback mutlaka verilmek zorunda, InitialValue verilmek zorunda değil. Bu durumda ilk Callback 1 ve 2. nesneler ile çağrılır.

Örnek
reduce() işlemine giren dizide tek eleman varsa, o değer sonuç olarak döner.Açıklaması şöyle.
If the array has only one element (regardless of position) and no initialValue was provided, or if initialValue is provided but the array is empty, the solo value would be returned without calling callback.
Şöyle yaparız.
// 1
[1,2,3,4,5].filter(x => x==3).reduce((x, y) => y) // -> 3, all good

// 2
[1,2,3,4,5].filter(x => x<=3).reduce((x, y) => 0) // -> 0, still good

// 3
[1,2,3,4,5].filter(x => x==3).reduce((x, y) => 0) // -> 3, hello?

1. Callback Metodu
Callback 4 tane parametre alabilir. Bunlar şöyledir.
1.Accumulator (acc)
2.Current Value (cur)
3.Current Index (idx)
4.Source Array (src)
İlk parametre accumulator olarak adlandırılır. Bu aslında dictionary nesnesidir. Bu metod nesneyi belirli bir alana göre gruplamak için kullanışlı. Java'daki groupingBy() metodu gibi kullanılabilir.

1.1 accumulator + current value
Örnek
Elimizde şöyle bir kod olsun. Aynı date alanına sahip nesneleri gruplar. Her gruba id alanını ekler.
let input=[{date:{day:27,month:1,year:2020},id:3},{date:{day:28,month:1,year:2020},id:4},
  {date:{day:31,month:1,year:2020},id:5},{date:{day:1,month:2,year:2020},id:6},
  {date:{day:2,month:2,year:2020},id:7}];

/* Convert the dictionary that will be created by reduce to a value array */
var output = Object.values(input.reduce((dict, item) => {
  
  const { date, id } = item;

  /* The distinct key for this item based on month/year of date field */
  const key = `${date.month}-${date.year}`;
  
  /* Check if dictionary already has an object value for key. This short hand
  will only insert a new object value for key, if one does not already exist
  in the dictionary */
  const value = dict[key] || { month : date.month, year : date.year, id : [] };

  /* Add the item id to the dictionary entries id array */
  value.id.push(id);
  
  /* Update value object for key */
  return { ...dict, [key] : value };
  
}, {}))

console.log(output);
Çıktı olarak şunu alırız.
0:
result: {month: 1, year: 2020, id:[3,4,5]}
1:
result: {month: 2, year: 2020, id:[6,7]}
Örnek - accumulator + current value
Şöyle yaparız. Accumulator içinde değer olup olmadığını kontrol etmek için [] kullanılır.
const data = [{"modelNumber":"123456789","balance":{"amount":1000,"currency":"EUR"}},
              {"modelNumber":"987654321","balance":{"amount":2000,"currency":"EUR"}},
                ...             ];

const result = Object.values(data.reduce((r, { balance }) => {
  const { amount, currency } = balance;
  if(!r[currency])
    r[currency] = { currency, amount: 0 };
  
  r[currency].amount += amount;
  
  return r;
}, {}));

console.log(result);
Örnek - accumulator + current value
Şöyle yaparız. Accumulator içinde değer olup olmadığını kontrol etmek için [] kullanılır.
const data = [
{email: '100@email.com', amount: '30', date: '2018-12'},
{email: '100@email.com', amount: '30', date: '2018-11'},
{email: '100@email.com', amount: '30', date: '2018-10'},

{email: '200@email.com', amount: 0,    date: '2018-12'},
{email: '200@email.com', amount:'30',  date: '2018-11'},
{email: '200@email.com', amount:'30',  date: '2018-10'},
{email: '200@email.com', amount:'30',  date: '2018-09'},
{email: '200@email.com', amount:'25',  date: '2018-08'},
{email: '200@email.com', amount:'25',  date: '2018-08'},]

let result = data.reduce((acc, {email, date, amount}) => {
  if (!acc[email]) acc[email] = { email };
  acc[email][date] = amount;
  return acc;
}, {});
console.log(Object.values(result));
Çıktı olarak şunu alırız.
const data = [
{
    email: '100@email.com',
    '2018-12': '30',
    '2018-11': '30',
    '2018-10': '30', 
    '2018-09': 0, 
    '2018-08': 0, 
    '2018-07': 0, 
    '2018-06': 0, 
    '2018-05': 0, 
    '2018-04': 0, 
    '2018-03': 0, 
    '2018-02': 0, 
    '2018-01': 0, 
    '2017-12': 0, 
},
{
    email: '200@email.com',
    '2018-12':0,
    '2018-11':'30',
    '2018-10':'30',
    '2018-09':'30',
    '2018-08':'25',
    '2018-07': 0,
    '2018-06': 0,
    '2018-05': 0,
    '2018-04': 0,
    '2018-03': 0,
    '2018-02': 0,
    '2018-01': 0,
    '2017-12': 0,
}]
Örnek - accumulator + current value
Şöyle yaparız. Accumulator içinde değer olup olmadığını kontrol etmek için in kullanılır.
const arr = [
  ['Deer Skin', 1],
  ['Bear Skin', 1],
  ['Deer Skin', 1],
  ['Cougar Skin', 2]
];

const res = arr.reduce((acc, elem) => {
  elem[0] in acc ? acc[elem[0]] += elem[1] : acc[elem[0]] = elem[1];
  return acc;
}, {});

console.log(res);
Çıktı olarak şunu alırız.
[ {name: 'Deer Skin', quantity: 4},
 {name: 'Bear Skin', quantity: 5},
 {name: 'Cougar Skin', quantity: 4} ... ]
1.2 accumulator + current value + index
Örnek - accumulator + current value + index
Şöyle yaparız.
let arr = [
    ["Jessica", "Ashley", "Emily", "Samantha", "Sarah", "Taylor"],
    ["Samantha", "Sarah", "Taylor", "Hannah", "Brittany", "Amanda"]
]

let lookup = arr[0].reduce((lookup, name, index) => {
    lookup[name] = index
    return lookup
}, {})
2. InitialValue
Callback'e geçilecek ilk değerdir.

Örnek - Initial Value Verilmiyor
Açıklaması şöyle. Eğer Initial Value verilmezse ve dizi boş ise hata (runtime error) alırız.
When you don't supply an initial value for the accumulator, the first call to your callback receives the first entry as the first argument and the second as the second.
Elimizde şöyle bir kod olsun. Çıktı olarak -36 alırız. Çünkü ilk çağrı 5,10 değerleri ile olur
const number = [5, 10, 13, 18];
var x = number.reduce((accumulator, currentValue) =>{return accumulator - currentValue});

console.log(x);
Örnek
Şöyle yaparız
function getSum(total, num) {
    return total + num;
}

var tempvalue = [...];
    
console.log('array', tempvalue);
console.log('total', tempvalue.reduce(getSum,0));