У меня есть объект, который выглядит так:

const inputObject = {
    "startDate": {
        "$gte": "2017-03-29T00:00:00.000Z",
        "$lte": "2017-08-20T00:00:00.000Z"
    },
    "$and": [
        { "$or": [
                {"details.thing": { "$in": [ "01" ] } },
                {"details.thing": { "$in": [ "01" ] } },
                {"details.thing": { "$in" : [ "01" ] } },
                {"details.thing": { "$in" : [ "01" ] } }
            ]
        },
        {
            "$or": []
        },
        {
            "$or": []
        }
    ]
}

Мне нужно разработать функцию, которая удаляет все существующие пустые подмассивы { "$or": [] },. Мой предполагаемый результат:

const outputObject = {
    "startDate": {
        "$gte": "2017-03-29T00:00:00.000Z",
        "$lte": "2017-08-20T00:00:00.000Z"
    },
    "$and": [
        { "$or": [
                {"details.thing": { "$in": [ "01" ] } },
                {"details.thing": { "$in": [ "01" ] } },
                {"details.thing": { "$in" : [ "01" ] } },
                {"details.thing": { "$in" : [ "01" ] } }
            ]
        }
    ]
}

Я могу сделать это для массива первого уровня в объекте, но я не уверен, как это сделать для второго уровня.

2
black_sheep07 29 Авг 2017 в 19:38

3 ответа

Лучший ответ

Вы можете использовать итеративный и рекурсивный подход для любой глубины.

function deepDelete(object, key) {
    Object.keys(object).forEach(function (k) {
        var i;
        if (Array.isArray(object[k])) {
            i = object[k].length;
            while (i--) {
                if (Array.isArray(object[k][i][key]) && object[k][i][key].length === 0) {
                    object[k].splice(i, 1);
                    continue;
                }
                deepDelete(object[k][i], key);
            }
            return;
        }
        if (object[k] && typeof object[k] === 'object') {
            deepDelete(object[k], key) 
        }
    });
}

var data = { startDate: { $gte: "2017-03-29T00:00:00.000Z", $lte: "2017-08-20T00:00:00.000Z" }, $and: [{ $or: [{ "details.thing": { $in: ["01"] } }, { "details.thing": { $in: ["01"] } }, { "details.thing": { $in: ["01"] } }, { "details.thing": { $in: ["01"] } }] }, { $or: [] }, { $or: [] }] };

deepDelete(data, '$or');

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 29 Авг 2017 в 16:55

Используйте Array.prototype.filter:

const outputObject = {
  "startDate": {
    "$gte": "2017-03-29T00:00:00.000Z",
    "$lte": "2017-08-20T00:00:00.000Z"
  },
  "$and": [
    { 
      "$or": [
        {"details.thing": { "$in": [ "01" ] } },
        {"details.thing": { "$in": [ "01" ] } },
        {"details.thing": { "$in" : [ "01" ] } },
        {"details.thing": { "$in" : [ "01" ] } }
      ]
    },
    {
      "$or": []
    }
  ]
};

var filtered = outputObject.$and = outputObject.$and
  .filter(cond => cond.$or.length > 0)
;

// console.log('filtered', filtered);
// shows only the resulting array, your Object remains
// outputObject
console.log('outputObject', outputObject);
2
Hitmands 30 Авг 2017 в 08:26
const inputObject = {
  startDate: {
    $gte: "2017-03-29T00:00:00.000Z",
    $lte: "2017-08-20T00:00:00.000Z"
  },
  $and: [
    {
      $or: [
        { "details.thing": { $in: ["01"] } },
        { "details.thing": { $in: ["01"] } },
        { "details.thing": { $in: ["01"] } },
        { "details.thing": { $in: ["01"] } }
      ]
    },
    {
      $or: []
    },
    {
      $or: []
    }
  ]
};

function isEqualToEmptyOr(obj) {
  return JSON.stringify(obj) === JSON.stringify({ $or: [] });
}

function removeOrRecursion(obj) {
  if (Array.isArray(obj)) {
    let result = [];
    obj.forEach(v => {
      if (!isEqualToEmptyOr(v)) {
        result = result.concat(removeOrRecursion(v));
      }
    });
    return result;
  } else if (typeof obj === "object") {
    let result = {};
    Object.keys(obj).forEach(key => {
      if (!isEqualToEmptyOr(obj[key])) {
        result[key] = removeOrRecursion(obj[key]);
      }
    });
    return result;
  } else {
    return obj;
  }
}

const result = removeOrRecursion(inputObject);
console.log(result);
0
Chenxi Yuan 29 Авг 2017 в 17:57