2014-09-10 16 views
11

yüzden böyle nesneler dizisi var. Sunulan uid, ile nesneyi yoksa veya sunulan uid dizide yoksa yeni bir öğe eklediğimizde nesneyi değiştirmek için zarif bir yol arıyorum. Ben işlevi js konsolda bu şekilde davranma olmak hayal:Güncelleme var veya nesnelerin dizisine yeni bir unsur eklerseniz zarif bir şekilde javascript + lodash

> addOrReplace(arr, {uid: 1, name: 'changed name', description: "changed description"}) 
> arr 
[ 
    {uid: 1, name: "bla", description: "cucu"}, 
    {uid: 2, name: "smth else", description: "cucarecu"}, 
] 
> addOrReplace(arr, {uid: 3, name: 'new element name name', description: "cocoroco"}) 
> arr 
[ 
    {uid: 1, name: "bla", description: "cucu"}, 
    {uid: 2, name: "smth else", description: "cucarecu"}, 
    {uid: 3, name: 'new element name name', description: "cocoroco"} 
] 

Bulunduğum yolu çok şık ve fonksiyonel olması görünmüyor: Ben lodash kullanıyorum

function addOrReplace (arr, object) { 
    var index = _.findIndex(arr, {'uid' : object.uid}); 
    if (-1 === index) { 
    arr.push(object); 
    } else { 
    arr[index] = object; 
    } 
} 

, bu yüzden oldu Özel eşitlik kontrolü ile değiştirilmiş _.union gibi bir şey düşünmek.

cevap

8

Sen bir yerine bir nesneyi kullanabilirsiniz kullanabilirsiniz dizisi:

var hash = { 
    '1': {uid: 1, name: "bla", description: "cucu"}, 
    '2': {uid: 2, name: "smth else", description: "cucarecu"} 
}; 

Anahtarlar, numaralı öğelerdir.

function addOrReplace(hash, object) { 
    hash[object.uid] = object; 
} 

GÜNCELLEME

dizisine ek olarak bir endeks olarak bir nesneyi kullanmak da mümkün değil: Artık işlevi addOrReplace böyle basit.

var arr = [], 
    arrIndex = {}; 

addOrReplace({uid: 1, name: "bla", description: "cucu"}); 
addOrReplace({uid: 2, name: "smth else", description: "cucarecu"}); 
addOrReplace({uid: 1, name: "bli", description: "cici"}); 

function addOrReplace(object) { 
    var index = arrIndex[object.uid]; 
    if(index === undefined) { 
     index = arr.length; 
     arrIndex[object.uid] = index; 
    } 
    arr[index] = object; 
} 

jsfiddle-demo bir göz atın (bir nesne yönelimli çözümü size here bulacaksınız) Belki

+0

dizininizde "delikler" bulunamaz. Evet, ben de bu yapıyı seviyorum, fakat kullandığım bazı kütüphaneler yok destekle Sadece dizileri geçebilen [Açısal typeahead] (https://github.com/angular-ui/bootstrap/tree/master/src/typeahead) gibi. – ganqqwerty

+1

Bu yapıyı yalnızca bir dizin olarak kullanabilirsiniz. Bu sayede hızlı aramalara ve bir dizi gibi şeyler için ek bir diziye ihtiyaç vardır. – friedi

1

uid aynı dizinin dizin olması hakkında, neye:?

arr = []; 
arr[1] = {uid: 1, name: "bla", description: "cucu"}; 
arr[2] = {uid: 2, name: "smth else", description: "cucarecu"}; 

bu şekilde sadece basitçe

arr[affectedId] = changedObject; 
+0

iyi çalışır. Sanırım bazen böyle değil. Ancak bu garantiye sahip olsaydım bile, eksik elemanlara sahip dizilere sahip olmaktan rahatsız oluyorum: 'arr [2134], arr [21], arr [0] mevcut değil. – ganqqwerty

+0

@ganqqwerty, klasik dizi kullanımlı bir (nesne) kullanımından dolayı, tamsayı olmayan indeksleri kullanabilir ve dizininizde – Drecker

3

:
Bu şekilde ayrıca bir çalışma dizisi hızlı aramaları var ve ettik

_.mixin({ 
    mergeById: function mergeById(arr, obj, idProp) { 
     var index = _.findIndex(arr, function (elem) { 
      // double check, since undefined === undefined 
      return typeof elem[idProp] !== "undefined" && elem[idProp] === obj[idProp]; 
     }); 

     if (index > -1) { 
      arr[index] = obj; 
     } else { 
      arr.push(obj); 
     } 

     return arr; 
    } 
}); 

ve

var elem = {uid: 3, name: 'new element name name', description: "cocoroco"}; 

_.mergeById(arr, elem, "uid"); 
3

Eski gönderi, ancak neden filtre işlevini kullanmıyorsunuz?

// If you find the index of an existing uid, save its index then delete it 
//  --- after the filter add the new object. 
function addOrReplace(argh, obj) { 
    var index = -1; 
    argh.filter((el, pos) => { 
    if(el.uid == obj.uid) 
     delete argh[index = pos]; 
    return true; 
    }); 

    // put in place, or append to list 
    if(index == -1) 
    argh.push(obj); 
    else 
    argh[index] = obj; 
} 

İşte nasıl çalıştığını gösteren bir jsfiddle gösterilmektedir. Uuid'in her zaman int olduğunu garanti ettiğimde

İlgili konular