2016-03-24 11 views
0

Ne "gerçekleştirmek için çalışıyorum Stackoverflow bu diğer görevinden PHP çözümüne benzer, ancak JavaScript:JavaScript: nesnelerin dizisinde maçı bulup ilk konuma taşınır

Multidimensional array, find item and move to the top?

ben aşağıdaki içeren bir nesne dönen ediyorum:

Object 1: 
      Id: "1" 
      Name: "Bill" 
    Object 2: 
      Id: "2" 
      Name: "Sarah" 
    Object 3: 
      Id: "3" 
      Name: "Mike" 
012:

$.get(uri, function (data) { 

    self.options = []; 

    $.each(data, function (index, item) { 
     self.options.push(item); 
    }); 
}); 

self.options [] gibi görünür

Dizi nesnesinde "Sarah" ı bulmalı ve dizinin ilk öğesi olmak için yukarı taşımalıyım. Bunu nasıl yapabilirim? *

+0

çözüm aslında irade tamamen aynı görünün - sadece JavaScript'te: bir döngü, bir koşul, bir ek ve bir unshift deyimi. Şimdi sorunun nedir, neyi denediniz, ve nasıl işe yaramadı? – Bergi

+0

@IntricatePixels: Eğer kendiniz kodlamayı denediyseniz, bu çalışma sırasında karşılaştığınız sorunla ilgili size yardımcı olabilmemiz için henüz çalışmayan bir kod yazarak bu girişimi bize göstermelisiniz. . Sadece fazla çaba göstermeden bir çözüm talep etmek, SO üzerinde kötü etik olarak kabul edilir. – Bergi

cevap

7

Sorununuzun İngilizce açıklamasını JavaScript'te tam anlamıyla yazabilirsiniz. daha derli toplu

array.unshift(      // add to the front of the array 
    array.splice(     // the result of deleting items 
    array.findIndex(    // starting with the index where 
     elt => elt.Name === 'Sarah'), // the name is Sarah 
    1)[0]        // and continuing for one item 
) 

Veya:

array.unshift(array.splice(array.findindex(elt => elt.Name === 'Sarah'), 1)[0]) 

Ama bu Sarah eksik durumda işlemez veya birden fazla Sarah yoktur. Daha genel bir çözüm, gelen diziyi bazı koşullara göre ikiye bölmek ve sonra bunları yeniden birleştirmek olacaktır. Yani bu tee işlevi yaptığı da budur:

function tee(a, fn) { 
    var non_matches = []; 
    var matches = a.filter(function(e, i, a) { 
    var match = fn(e, i, a); 
    if (!match) non_matches.push(e); 
    return match; 
    }); 
    return matches.concat(non_matches); 
} 

Şimdi ES6 içinde, sen ES5 ile

tee(a, e => e.Name === 'Sarah') 

ile Veya eski tarayıcılar için sonucu elde edebilirsiniz:

tee(a, function(e) { return e.Name === 'Sarah'; }) 
+0

Zarif 'tee' işlevini adlandırma. +1 – Hrishi

+0

Doğruydu, doğru yanıt olarak işaretlediğim @choz'un solutusu şu anda Safari'de veya diğer tarayıcılarda çalışmıyor gibi görünüyor (Chrome'da çalışıyor). Doğru cevap olarak işaretlemedim. Ancak, çalıştığınız çözümün ayrıştırma hatası aldığımdan da alamıyorum: Beklenmeyen belirteç: işleç (>). "=>" Bölümünü beğenmediği görülüyor. Düşüncesi olan var mı? – IntricatePixels

+0

ES6 olmayan bir sürüm eklediniz, belki de işe yarayacak. –

1

Bunu yapmak için Array.prototype.sort kullanabilirsiniz.

E.g.

var arr = []; 
arr.push({Id:"1", Name:"Bill"}); 
arr.push({Id:"2", Name:"Sarah"}); 
arr.push({Id:"3", Name:"Mike"}); 

arr.sort(function(first, second) { 
    if (second.Name == "Sarah") return 1; 
}); 

console.log(arr); 
// [Object { Id="2", Name="Sarah"}, Object { Id="1", Name="Bill"}, Object { Id="3", Name="Mike"}] 

Veya başka alternatif bir,

var arr = []; 
arr.push({Id:"1", Name:"Bill"}); 
arr.push({Id:"3", Name:"Mike"}); 
arr.push({Id:"2", Name:"Sarah"}); 

function getIndexByName(name) { 
    for(var i = 0; i < arr.length; i++) { 
     if (arr[i].Name == name) { 
      return i; 
     } 
    } 
} 

var pos = getIndexByName("Sarah"); 
arr.splice(0, 0, arr[pos++]) // Insert Sarah at `arr` first position 
arr.splice(pos, 1); // Remove old Sarah 
+0

Teşekkürler, bu yaptı! Uzun ve zor bir şekilde deniyordum. – IntricatePixels

+0

@IntricatePixels Yardım ettiğine sevindim. – choz

+0

Hayır, bunu yapmak için [bu karşılaştırma işlevini kesinlikle kullanamazsınız] (http://stackoverflow.com/q/24080785/1048572). – Bergi

-1

Burada ne soran yapmak için bir yoldur.

$.get(uri, function (data) { 

    self.options = []; 
    var chosenName = 'Sarah' 
    var tmp = []; 
    $.each(data, function (index, item) { 
     // if we find it while iterating through do not add it, store it it tmp 
     if (item.Name === chosenName) { 
      tmp.push(item); 
     } else { 
      self.options.push(item); 
     } 
    }); 
    // if we found it push it to the front of the array 
    if (tmp.length > 0) self.options = tmp.concat(self.options) 
}); 
+1

Birden çok eşleşme varsa - bazı verileri kaybedersiniz. – zerkms

+0

@zerkms iyi nokta Cevabımı ayarladık. Kabul edilen cevap, büyük bir veri kümeniz olmadığı sürece gitmenin yoludur. – joemillervi