2017-01-03 3 views
3

Lassen Sie uns sagen, ich habe diese Aufgabe:sortieren Änderungen/bearbeitete Liste von Objektdaten in einem Array

{ 
    "data": { 
    "result": [ 
     { 
     "id": 25, 
     "lineNo": "222", 
     "description": "hello" 
     }, 
     { 
     "id": 30, 
     "lineNo": "765", 
     "description": "hmmm" 
     }, 
     { 
     "id": 31, 
     "lineNo": "112", 
     "description": "last" 
     } 
    ] 
    } 
} 

und dann habe ich description in id 30 von hmmm zu ändern:

{ 
    "id": 30, 
    "lineNo": "765", 
    "description": "should be first" 
    }, 

und es wird wie folgt:

{ 
    "data": { 
    "result": [ 
     { 
     "id": 25, 
     "lineNo": "222", 
     "description": "hello" 
     }, 
     { 
     "id": 30, 
     "lineNo": "765", 
     "description": "should be first" 
     }, 
     { 
     "id": 31, 
     "lineNo": "112", 
     "description": "last" 
     } 
    ] 
    } 
} 

Meine Frage ist, wie kann ich ändern/sortieren, nachdem ich bearbeitet habe das Objekt? Ich mag das letzte bearbeitete Objekt an der Spitze wie folgen aus:

{ 
    "data": { 
    "result": [ 
     { 
     "id": 30, 
     "lineNo": "765", 
     "description": "should be first" 
     }, 
     { 
     "id": 25, 
     "lineNo": "222", 
     "description": "hello" 
     }, 
     { 
     "id": 31, 
     "lineNo": "112", 
     "description": "last" 
     } 
    ] 
    } 
} 

ich auch Lodash Bibliothek verwenden, wenn jemand ein Beispiel mit lodash kennen oder native bitte mich darauf verweisen. Danke im Voraus.

+0

Das ist interessant. Ein Hinweis, 'array.prototype.every', würde Sie auf den Weg bringen. – Mouser

+1

@Mouser, mehr ['forEach'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) –

+0

Sie müssen die Spuren der geänderten Objekte behalten. Wenn Sie die Möglichkeit haben, den Code zu ändern, der diese Änderungen vornimmt, oder dort einen Haken setzen können, müssen Sie lediglich eine Warteschlange mit den geänderten Objekten und dann einen einfachen Algorithmus für die geänderten Elemente und dann alle im Array verbliebenen Elemente beibehalten diese Reihenfolge. Wenn Sie jedoch nicht kontrollieren können, wann diese Änderungen auftreten, müssen Sie möglicherweise Object.observe verwenden. –

Antwort

2

Sie könnten mit dem wollte id mit Array#some für das Element suchen, splice es und unshift das Element mit dem Array.

function updateArrayAndMove(array, id, key, value) { 
 
    array.some(function (o, i, a) { 
 
     if (o.id === id) { 
 
      o[key] = value; 
 
      a.unshift(a.splice(i, 1)[0]); 
 
      return true; 
 
     } 
 
    }); 
 
} 
 

 
var object = { data: { result: [{ id: 25, lineNo: "222", description: "hello" }, { id: 30, lineNo: "765", description: "hmmm" }, { id: 31, lineNo: "112", description: "last" }] } }; 
 

 
updateArrayAndMove(object.data.result, 30, 'description', 'should be first'); 
 
console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

Wenn das OP lodash verwendet, dann kann der Aufruf 'getIndexOfId' durch '_.findIndex (object.data.result, item => item.id === 30) ersetzt werden) '. – Assan

1

var object = 
 
{ 
 
    "data": { 
 
    "result": [ 
 
     { 
 
     "id": 25, 
 
     "lineNo": "222", 
 
     "description": "hello" 
 
     }, 
 
     { 
 
     "id": 30, 
 
     "lineNo": "765", 
 
     "description": "should be first" 
 
     }, 
 
     { 
 
     "id": 31, 
 
     "lineNo": "112", 
 
     "description": "last" 
 
     } 
 
    ] 
 
    } 
 
} 
 

 
function changeElement(id, key, value) 
 
{ 
 
    var changedId = -1; 
 
    var arrReturned = object.data.result.forEach(function(element, index){ 
 
    if (element['id'] == id) 
 
    { 
 
     element[key] = value; 
 
     changedId = index; //push the changed index into the array 
 
    } 
 
    }); 
 
    
 
    //element has changed 
 
    //use splice to change the order 
 
    var element = object.data.result.splice(changedId, 1); 
 
    object.data.result.unshift(element[0]) 
 
    
 
    console.log(object) 
 
} 
 

 
changeElement(30, "description", "should be first");

Eine mögliche Lösung für Ihr Problem, foreach zu ändern und Spleiß und unshift zu manipulieren.

0

All diese Antwort gab mir eine Idee. So machen Sie es mit lodash. Sie müssen das ID-Objekt kennen, das Sie gerade aktualisiert haben.

var object = 
    { 
     "data": { 
     "result": [ 
      { 
      "id": 25, 
      "lineNo": "222", 
      "description": "hello" 
      }, 
      { 
      "id": 30, 
      "lineNo": "765", 
      "description": "should be first" 
      }, 
      { 
      "id": 31, 
      "lineNo": "112", 
      "description": "last" 
      } 
     ] 
     } 
    } 

    var filteredObj = _.remove(object.data.result, function(o) { 
     return o.id == '30'; // must know object id 
    }); 
    object.data.result.unshift(filteredObj[0]); 

    console.log("mutated object.data.result", object.data.result) 

Beispiel: https://fiddle.jshell.net/uLqfuqn1/

Referenz: https://lodash.com/docs/4.17.4#remove

Dank all dieser Antwort.

Verwandte Themen