2016-01-11 21 views
5

Yani nesneler dizisi vardır;hareket dizi elemanı

[ 
    { 
     "foo": 2, 
     "bar": "test" 
    }, 
    { 
     "foo": 19, 
     "bar": "value" 
    }, 
    { 
     "foo": 7, 
     "bar": "temp" 
    } 
] 

bir dizinin başlangıcına foo belirli bir değeri olan bir nesne taşımak gerekir. Değer her zaman nesnededir, ancak nesnenin dizide bulunacağına dair bir garanti yoktur.

Yani örneğin moveToFront(19); çalıştırdıktan sonra, ben olurdu aşağıdadır:

[ 
    { 
     "foo": 19, 
     "bar": "value" 
    }, 
    { 
     "foo": 2, 
     "bar": "test" 
    }, 
    { 
     "foo": 7, 
     "bar": "temp" 
    } 
] 

nasıl bunu hakkında gitmek?

+0

sonra daha iyi bir veri yapısını bir dizi, ne gereksinimleri/ne yapmaya çalışıyoruz edilir olabilir? Bu dizinin etrafındaki şeyleri ne sıklıkta taşımanız gerektiğine ve ne kadar büyük bir hızla pahalıya mal olabileceğine bağlı olarak. – James

+0

neden? Ne yapmaya çalışıyorsun, bu dizinin içindeki elementleri hareket ettirmen gerektiğini düşündün mü? –

+0

Nesnenin amacı dizinin önündedir? – Monkpit

cevap

9

Bu oldukça önemsiz olmalı, aradığınız öğeyi bulana kadar dizininizi ararsınız, daha sonra splice onu ve unshift yeniden başa dönün. Böyle bir şey:

// foo is the target value of foo you are looking for 
// arr is your array of items 
// NOTE: this is mutating. Your array will be changed (unless the item isn't found) 
function promote(foo, arr) { 
    for (var i=0; i < arr.length; i++) { 
     if (arr[i].foo === foo) { 
      var a = arr.splice(i,1); // removes the item 
      arr.unshift(a[0]);   // adds it back to the beginning 
      break; 
     } 
    } 
    // Matching item wasn't found. Array is unchanged, but you could do something 
    // else here if you wish (like an error message). 
} 

eşleşen bir foo değeri ile hiçbir öğe yoksa, o zaman bu sizin diziye hiçbir şey yapacağız. İsterseniz bunu bir hata mesajı ile halledebilirsiniz.

0

Sen, dizi yineleme sağ maddeyi bulmak, onu splice ve dizinin kalanı concat birleştirilmiş diziye olabilir.

var collection = [ 
    { 
    foo: 15, 
    bar: true 
    }, 
    { 
    foo: 19, 
    bar: false 
    } 
]; 

function moveToFront(x) { 
    for (var i = 0; i < collection.length; i++) { 
    if (collection[i].foo === x) { 
     collection = collection.splice(i, 1).concat(collection); 
     break; 
    } 
    } 
} 

moveToFront(19); 

console.log(collection); 
+2

Not içine bakın. –

0

Her öğede herhangi bir değeri ara, ilk eşleşme kazanır. Çok hızlı görünüyor çünkü 'bazı' yöntemini kullanıp koşul yerine getirildiğinde tha dizisi üzerinde yinelemeyi kırıyor. Bu geri doğru bir değer verir bulana kadar

'bir' dizideki her element olan bir kez geri arama işlevi yürütür. Böyle bir eleman bulunursa, bazı() hemen doğru döner. Mutasyon, bir başka çözümdür ...

var collection = [ 
    { 
     "foo": 2, 
     "bar": "test" 
    }, 
    { 
     "foo": 19, 
     "bar": "value" 
    }, 
    { 
     "foo": 7, 
     "bar": "temp" 
    } 
]; 


function moveToFront(searchValue) { 

    var idx, exists; 

    for (idx = 0; idx < collection.length; idx++) { 
      exists = Object.keys(collection[idx]).some(function (key) { 
      return collection[idx][key] === searchValue 
     }); 
     if (exists) break; 
    } 

    collection.unshift(collection[idx]); 
    collection.splice(idx + 1, 1); 

} 

moveToFront("temp"); // or moveToFront(19); or move whatever 
console.log(collection); 
0

Yine başka bir çözüm. yerinde Mutasyon ...

var collection = [ 
    { 
     "foo": 2, 
     "bar": "test" 
    }, 
    { 
     "foo": 19, 
     "bar": "value" 
    }, 
    { 
     "foo": 7, 
     "bar": "temp" 
    } 
]; 


function moveToFront(property, value, col) { 
    col.reduce(function (prev, current, idx, obj) { 
     if (current[property] != value) { 
      return obj; 
     } else { 
      obj.unshift(obj[idx]); 
      obj.splice(idx + 1, 1); 
     } 
    }); 
} 

moveToFront('foo', 7, collection); 
console.log(collection); 
4

Zaten kullanırsanız lodash projenizde, findIndex yöntem yararlı olacaktır:

var data = [ 
 
    { 
 
     "foo": 2, 
 
     "bar": "test" 
 
    }, 
 
    { 
 
     "foo": 19, 
 
     "bar": "value" 
 
    }, 
 
    { 
 
     "foo": 7, 
 
     "bar": "temp" 
 
    } 
 
]; 
 

 
// find target index (using lodash) 
 
var itemIndex = _.findIndex(data, {foo:19}); 
 
// new index, no removal, detach the item and return it 
 
data.splice(0, 0, data.splice(itemIndex, 1)[0]); 
 

 

 
// print result 
 
console.log(data)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Bu hareket edecek Dizi Nesne, dizinin başlangıcına "foo": 19 anahtarıyla.