javascript - JS - Bir nesne dizisinde .every metodunu kullanma


Çok boyutlu dizilerde array.every metodunu kullanmanın mümkün olup olmadığını bilmem gerekiyor.

Dizim şöyle görünüyor:

tabs=[
{label: string, icon: icon, routerLink: link},
{label: string, icon: icon, routerLink: link},
{label: string, icon: icon, routerLink: link}]

Sekmelerin içindeki her ETİKET'in belirli bir etikete eşit olup olmadığını bilmem gerekiyor. Ben bir yeni başlayan programcı olduğum için ne yaptığımı anlamak istiyorum, bu yüzden ayrıntılı bir cevap verirseniz gerçekten çok sevinirim! Ama yine de istediğiniz gibi cevap verebilirsiniz. :) Şimdiden teşekkürler!

DÜZENLEME: Tabmenu(ng2, primeng) öğeme Sekmeler eklemek için bu yöntemi kullanıyorum:

addTab(id: string) {
  if (id === 'linechart') {
    this.tab = {
      label: 'NW-Details',
      icon: 'fa-area-chart',
      routerLink: ['/nwdetails']
    }
    TABS.push(this.tab);
  }
  if (id === 'piechart') {
    this.tab = {
      label: 'IO-Details',
      icon: 'fa-pencil',
      routerLink: ['/iodetails']
    }
    TABS.push(this.tab)
  }
}

TABS primeng tarafından sunulan MenuItem[] türündeyken, tab herhangi bir türdedir.

Her seferinde bir grafiğe çift tıkladığımda, bu çağrılıyor ve menüme yeni bir sekme ekleniyor. Şimdi belirli bir etikete sahip bir sekmenin zaten açılıp açılmadığını kontrol etmek istiyorum, böylece tekrar açılmasın. Bunu if ile birleştirilmiş for döngüleri kullanarak denedim.

for (i = 0; i < TABS.length; i++) {
  if (TABS[i].label !== 'NW-Details') {
    this.tab = {
      label: 'NW - Details',
      icon: 'fa - area - chart'
      TABS.push(this.tab)
    }
  }

Ama bu, her eşit olmadığında yeni bir sekme açıyor, bu yüzden zaten açık olan birden fazla sekme varsa, çift tıklamada aslında birden fazla sekme açılıyor.

Cevap #1

Array#every metodunu kullanabilirsiniz.

tabls.every(function(v){
  return v.label !== someValue
})

Şurayı kontrol et MDN belgeleri :

every yöntemi, sağlanan geri arama (callback) fonksiyonunu, dizide bulunan her bir öğe için bir kez çalıştırır; ta ki geri arama fonksiyonu yanlış (Boolean'a dönüştürüldüğünde false olan) bir değer döndüren bir öğe bulana kadar. Eğer böyle bir öğe bulunursa, every yöntemi hemen false döner. Aksi takdirde, eğer callback tüm öğeler için true bir değer döndürdüyse, every true dönecektir. callback yalnızca değer atanmış dizinler için çağrılır; silinmiş veya hiç değer atanmamış dizinler için çağrılmaz.


veya Array#some yöntemini kullanın

!tabls.some(function(v){
  return v.label === someValue
})

MDN belgelerini kontrol edin:

some(), callback fonksiyonunu, callback'in doğruluk değerine (Boolean’a dönüştürüldüğünde true olan bir değer) sahip olduğu bir öğeyi bulana kadar dizideki her eleman için bir kez çalıştırır. Böyle bir öğe bulunursa, some() hemen true döner. Aksi takdirde some() false döner. Callback yalnızca atanan değere sahip dizinler için çağrılır; silinmiş veya hiç değer atanmamış dizinler için çağrılmaz.

Cevap #2

Dizi fonksiyonlarının imzası şu şekilde bir şeydir:

Array.prototype.functionName = function(callback){
  for (var i = 0; i< this.length; i++){
    if(callback(this[i]))
      // do something.
    else
      // do something.
  }
}

Boolean değer döndüren bir geri çağırmayı bekler, yani true veya false (varsayılan).

her biri vs bazıları

Her ikisi de benzer bir şekilde kullanılabilse de, uygun anlamı iletecek şekilde kullanılmalıdır.

var d = [1,2,3,4,5];
var valid = d.every(function(num){ return !isNaN(num); });
console.log(valid)

Yukarıdaki kod, “tüm elemanlar sayı ise geçerlidir” anlamına gelir. .some kullanabilirsiniz, ancak bu durumda anlam “biri sayı değilse geçersizdir” olarak değişecektir. Okunabilirliği artırmak için bunları kodun mevcut bağlamına göre kullanmalısınız.

Referanslar

  • Array.every - Polyfill
  • Array.every - Tarayıcı Uyumluluğu

İlgili makaleler