I am having trouble splicing an element from a nested json object

Viewed 36

I have a JavaScript file called Splice.js

var searchresponse = [{
  "items": [{
      "employeeId": "ABC",
      "type": "D",
      "alive": "Yes"

  }, {
      "employeeId": "DEF",
      "type": "D",
      "alive": "Yes"

  }, {
      "employeeId": "NPK",
      "type": "D",
      "alive": "Yes"

  }, {
      "employeeId": "PKN",
      "type": "A",
      "alive": "Yes"
  }],
  "more": false
}];
var data1=["ABC","DEF"];
var items=searchresponse[0].items;
var i=items.length;
while (i--) {
    if(data1.indexOf(items[i].employeeId)!=-1){
        items.splice(i,1);
    }
}
console.log(searchresponse[0].items);

How could I achieve the same result from a nested JSON object like the one below?

var searchresponse = [{
  "order": [
      {
          "items": [
              { 
                  "route": "foo", 
                  "display": "foo" ,
                  "employeeId": "ABC"
              },
              { 
                  "route": "bar", 
                  "display": "bar" ,
                  "employeeId": "DEF"
              },
              { 
                  "route": "baz", 
                  "display": "baz" ,
                  "employeeId": "GHI"
              },
              { 
                  "route": "qux", 
                  "display": "qux" ,
                  "employeeId": "JKL"
              }
          ]
      }
  ],
  "more": false
}];

var data1=["ABC","DEF"];
var items=searchresponse[0].items;
var i=items.length;
while (i--) {
    if(data1.indexOf(items[i].employeeId)!=-1){
        items.splice(i,1);
    }
}
console.log(searchresponse[0].items);

I have been having a difficult time with this and really could appreciate a second pair of eyes to see where I am messing this one up! Any help would be greatly appreciated!

2 Answers

Just address the right property: searchresponse[0].order[0].items

var searchresponse = [{
  "order": [{
    "items": [{
        "route": "foo",
        "display": "foo",
        "employeeId": "ABC"
      },
      {
        "route": "bar",
        "display": "bar",
        "employeeId": "DEF"
      },
      {
        "route": "baz",
        "display": "baz",
        "employeeId": "GHI"
      },
      {
        "route": "qux",
        "display": "qux",
        "employeeId": "JKL"
      }
    ]
  }],
  "more": false
}];

var data1 = ["ABC", "DEF"];
var items = searchresponse[0].order[0].items;
var i = items.length;
while (i--) {
  if (data1.indexOf(items[i].employeeId) != -1) {
    items.splice(i, 1);
  }
}
console.log(searchresponse[0].order[0].items);

Here is a solution using object-scan.

A few notes:

  • Splicing works here because object-scan traverses the array in "delete-safe" order.
  • Traverses through all nested array items, while the accepted answer only traverses through the first array entry for root and order. This could easily be adjusted by changing * to 0
  • More flexible than the accepted solution
  • Modifies the passed object. Is this is undesired, the input could be cloned before passing it

.as-console-wrapper {max-height: 100% !important; top: 0}
<script type="module">
import objectScan from 'https://cdn.jsdelivr.net/npm/object-scan@18.4.0/lib/index.min.js';

const searchresponse = [{ order: [{ items: [{ route: 'foo', display: 'foo', employeeId: 'ABC' }, { route: 'bar', display: 'bar', employeeId: 'DEF' }, { route: 'baz', display: 'baz', employeeId: 'GHI' }, { route: 'qux', display: 'qux', employeeId: 'JKL' }] }], more: false }];

const fn = objectScan(['[*].order[*].items[*].employeeId'], {
  filterFn: ({ value, gparent, gproperty, context }) => {
    if (context.includes(value)) {
      gparent.splice(gproperty, 1);
      return true;
    }
    return false;
  },
  rtn: 'count'
});

const toRemove = ['ABC', 'DEF'];
const removedCount = fn(searchresponse, toRemove);
console.log(removedCount);
// => 2

console.log(searchresponse[0].order[0].items);
/* => [
  { route: 'baz', display: 'baz', employeeId: 'GHI' },
  { route: 'qux', display: 'qux', employeeId: 'JKL' }
] */
</script>

Disclaimer: I'm the author of object-scan

Related