Search code examples
javascriptarraysjavascript-objects

How can I reorder an ELEMENT inside of an OBJECT of an array of OBJECTS NOT sort?


Every search for how to reorder (NOT SORT) an element inside of an object of an array of objects keeps returning how to SORT an array. That's not what I want.

Here's a quit and dirty example:

let obj = [
  {
     name: "hi number 1a",
     id: "hi number 2a",
     address: "hi number 3a"
  },  {
     name: "hi number 1b",
     id: "hi number 2b",
     address: "hi number 3b"
  },  {
     name: "hi number 1c",
     id: "hi number 2c",
     address: "hi number 3c"
  },  {
     name: "hi number 1d",
     id: "hi number 2d",
     address: "hi number 3d"
  }
]

What I want to do is LOOP through all the objects and REORDER them so id is NOW in name's position for all of them, like so:

let obj = [
  {
     id: "hi number 2a",
     name: "hi number 1a",
     address: "hi number 3a"
  },  {
     id: "hi number 2b",
     name: "hi number 1b",
     address: "hi number 3b"
  },  {
     id: "hi number 2c",
     name: "hi number 1c",
     address: "hi number 3c"
  },  {
     id: "hi number 2d",
     name: "hi number 1d",
     address: "hi number 3d"
  }
]

Here's the code I've tried:

        $scope.arraymove = (arr, fromindex, toindex) => {

            let len = arr.length;
            let newArr = [];
            let resultArr = [];

            for (let i = 0; i < len; i++) {
                resultArr[i] = move(arr[i], fromindex, toindex);
                newArr.push(resultArr[i]);
            }

            function move(thearr, old_index, new_index) {
                while (old_index < 0) {
                    old_index += len;
                }
                while (new_index < 0) {
                    new_index += len;
                }
                if (new_index >= len) {
                    var k = new_index - len;
                    while ((k--) + 1) {
                        thearr.push(undefined);
                    }
                }
                thearr.splice(new_index, 0, thearr.splice(old_index, 1)[0]); // CODE DIES HERE

                console.log("NEW ARRAY: ", thearr);
                return thearr;
            }

            console.log("New Reordered ARRAY: ", newArr);
            return newArr;
        }

What happens is that the INCOMING arr loses SCOPE and when it hits splice, I get SPLICE is a function.

Yes, I'm working for a LARGE telecom STILL using AngularJS. Anyway, it's simply pure javascript at this point.


Solution

  • Here you go, though be aware that object field order cannot be guaranteed.

    let obj = [
      {
         name: "hi number 1a",
         id: "hi number 2a",
         address: "hi number 3a"
      },  {
         name: "hi number 1b",
         id: "hi number 2b",
         address: "hi number 3b"
      },  {
         name: "hi number 1c",
         id: "hi number 2c",
         address: "hi number 3c"
      },  {
         name: "hi number 1d",
         id: "hi number 2d",
         address: "hi number 3d"
      }
    ]
    let newobj = obj.map( o => ({id: o.id, name: o.name, address: o.address}));
    console.log(newobj)