Проверьте, не является ли массив объектов ключом пустым, и склейте его - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть массив объектов, в котором есть пустой ключ со значением Boolean, если значение Boolean равно false, то массив объектов должен быть сращен.

Ниже приведена структура массива:

this.dataTobeDeleted= [{
    NotificationID: "2180",
    Quantity: 1,
    NotificationName: "453",
    AlertNumber: "02/19/2020",
    "": true
  },
  {
    NotificationID: "2182",
    Quantity: 1,
    NotificationName: "453",
    AlertNumber: "02/19/2020",
    "": false
  },
  {
    NotificationID: "2181",
    Quantity: 1,
    NotificationName: "453",
    AlertNumber: "02/19/2020",
    "": false
  }
]

В приведенном выше массиве есть пустая строка «ключ», если значение ключа равно false, тогда необходимо объединить массив объектов с помощью индекса.

Ниже приведен код, который я пробовал:

for (var i = 0; i < this.dataTobeDeleted.length; i++) {
    for (var val in this.dataTobeDeleted[i]) {
      if (val === "") {

        this.dataTobeDeleted[i]['isCheckedValue'] = this.dataTobeDeleted[i][""]; // insetring new key for empty key string
        delete this.dataTobeDeleted[i][""]; // Delete old key 
        if (this.dataTobeDeleted[i].isCheckedValue === false) {
          this.dataTobeDeleted.splice(i, 1)
        }
      }
    }
}

Приведенный выше код верен, но он мне нужен в более коротком виде, так как код, который я пробовал, длиннее, и когда данных слишком много, это создаст проблему.

Я также пытался использовать фильтр, но у меня нет пустого ключа для проверки значения boolean.

Ответы [ 6 ]

3 голосов
/ 19 февраля 2020

у меня работает, попробуйте пожалуйста

var newArr = dataTobeDeleted.filter((val) =>{return val[""] === true});
3 голосов
/ 19 февраля 2020

Если вы хотите сделать это путем изменения оригинального массива с помощью сплайсинга.

Убедитесь, что вы * l1011 * массива в обратном направлении, это предотвратит проблемы с индексом l oop, выходящими из syn c когда вы изменяете массив.

Пример ниже ..

const dataTobeDeleted= [{
    NotificationID: "2180",
    Quantity: 1,
    NotificationName: "453",
    AlertNumber: "02/19/2020",
    "": true
  },
  {
    NotificationID: "2182",
    Quantity: 1,
    NotificationName: "453",
    AlertNumber: "02/19/2020",
    "": false
  },
  {
    NotificationID: "2181",
    Quantity: 1,
    NotificationName: "453",
    AlertNumber: "02/19/2020",
    "": false
  }
];

for (let ix = dataTobeDeleted.length -1; ix >= 0; ix --) {
  if (!dataTobeDeleted[ix][''])
    dataTobeDeleted.splice(ix, 1);
}

console.log(dataTobeDeleted);
3 голосов
/ 19 февраля 2020

Используйте фильтр массива для удаления ненужных элементов:

this.dataTobeDeleted.filter(x => !!x[''])

DEMO: https://stackblitz.com/edit/router-template-1t2xz7

Это создаст новый массив, сохраняя только те, где собственность '' правдива. Если вы хотите быть более строгим, вы можете использовать строгую логическую проверку:

this.dataTobeDeleted.filter(x => x[''] === true)
0 голосов
/ 19 февраля 2020

Это экспериментально, но вы также можете поиграть с нативным итератором ES6 (используя генератор) вместо того, чтобы перебирать данные в обратном направлении.

class ClassicIterator {
  constructor(list) {
    this.list = list;
    this.index = 0;
  }
  *[Symbol.iterator]() {
    while (this.index < this.list.length) {
      yield this.list[this.index];
      this.index++; // Move forward
    }
  }
  remove() {
    this.list.splice(this.index, 1);
    this.index--; // Rollback
  }
}

class InPlaceFilter {
  constructor(opts) {
    this.list = opts.list;
    this.filterFn = opts.filterFn;
  }  
  execute() {
    let it = new ClassicIterator(this.list);
    for (let item of it) {
      if (!this.filterFn(item)) {
        it.remove();
      }
    }
    return this;
  }
  get() {
    return this.list;
  }
}

const data = [
  { NotificationID:"2180", Quantity:1, NotificationName:"453", AlertNumber:"02/19/2020", "":true  },
  { NotificationID:"2181", Quantity:1, NotificationName:"453", AlertNumber:"02/19/2020", "":false },
  { NotificationID:"2182", Quantity:1, NotificationName:"453", AlertNumber:"02/19/2020", "":false },
  { NotificationID:"2183", Quantity:1, NotificationName:"453", AlertNumber:"02/19/2020", "":true  }
];

let sameRef = new InPlaceFilter({
  list : data,
  filterFn : (e) => e[''] === false
}).execute().get();

console.log('Are the same?:', sameRef === data); // Same list!
.as-console-wrapper { top: 0; max-height: 100% !important; }

Упрощенная версия:

const InPlaceFilter = (opts) => {
  for (let i = opts.list.length - 1; i >= 0; i--) {
    if (!opts.filterFn(opts.list[i])) {
      opts.list.splice(i, 1);
    }
  }
  return opts.list;
}

const data = [
  { NotificationID:"2180", Quantity:1, NotificationName:"453", AlertNumber:"02/19/2020", "":true  },
  { NotificationID:"2181", Quantity:1, NotificationName:"453", AlertNumber:"02/19/2020", "":false },
  { NotificationID:"2182", Quantity:1, NotificationName:"453", AlertNumber:"02/19/2020", "":false },
  { NotificationID:"2183", Quantity:1, NotificationName:"453", AlertNumber:"02/19/2020", "":true  }
];

let otherRef = data.filter(e => e[''] === false);
let sameRef = InPlaceFilter({
  list : data,
  filterFn : (e) => e[''] === false
});

console.log('Are the same?:', sameRef === data);     // Same list!
console.log('Are the same?:', sameRef === otherRef); // Not the same list!
.as-console-wrapper { top: 0; max-height: 100% !important; }
0 голосов
/ 19 февраля 2020
const isCheckedValue = obj => !!(obj[''])
this.dataToBeDeleted = dataToBeDeleted.filter(isCheckedValue)
console.log(result)

Если вы хотите исправить такие объекты, просто используйте карту

this.dataToBeDeleted = dataToBeDeleted.map(obj => {
   obj.isCheckedValue = obj['']
   delete obj[''] // mutations, not good :(
})

0 голосов
/ 19 февраля 2020

Цитирование из MDN в Object.keys():

Метод Object.keys() возвращает массив имен собственных перечисляемых свойств данного объекта, повторяемых в том же порядке, что и обычный l oop будет.

Затем вы можете найти пустой ключ и удалить его с помощью метода delete.

const deletedData = dataTobeDeleted.map((item, index) => {
    Object.keys(item).map(key => {
        if (!item['']) {
            dataTobeDeleted.splice(index, 1);
        }
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...