Лучше инициализируйте массив объектов с неизвестными ключами, используя es6 - PullRequest
1 голос
/ 26 марта 2020

У меня есть объект следующим образом:

{
    "counts": {
        "created_by_ref": {
            "00f5c303-32c0-4f5f-ac61-bf6577a8f4ed": 1,
            "0dde2de1-7951-45b1-8bf3-013f8dbfc4ae": 1
        },
        "file.hashes.MD5": {
            "qqq": 200
        },
        "ipv4_addr.value": {
            "127.0.0.1": 200,
            "192.168.1.10": 200
        },
        "network_traffic.dst_port": {
            "xxx": 200
        },
        "network_traffic.dst_ref.resolves_to_refs.value": {
            "yyy": 200
        },
        "network_traffic.dst_ref.value": {
            "rrr": 200
        }
    }
}

Мне нужно инициализировать все значения в 0 следующим образом:

{
    "counts": {
        "created_by_ref": {
            "00f5c303-32c0-4f5f-ac61-bf6577a8f4ed": 0,
            "0dde2de1-7951-45b1-8bf3-013f8dbfc4ae": 0
        },
        "file.hashes.MD5": {
            "qqq": 0
        },
        "ipv4_addr.value": {
            "127.0.0.1": 0,
            "192.168.1.10": 0
        },
        "network_traffic.dst_port": {
            "xxx": 0
        },
        "network_traffic.dst_ref.resolves_to_refs.value": {
            "yyy": 0
        },
        "network_traffic.dst_ref.value": {
            "rrr": 0
        }
    }
}

и все ключи, кроме count, неизвестны и динамически изменение так не может быть жестким кодом. Я сделал следующее:

  for (const key in getSearchDataAllCounts) {
    if (getSearchDataAllCounts.hasOwnProperty(key)) {
      Object.keys(getSearchDataAllCounts[key]).forEach((innerkey) => {
        getSearchDataAllCounts[key][innerkey] = 0;
      });
    }
  }

Но я действительно думаю, что в ES6 есть лучший способ сделать это. Есть ли какие-либо улучшения, которые я могу сделать, чтобы сделать его более совместимым с es6, а также сделать это предпочтительно с одним l oop?

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

ES2015 + на самом деле мало что дает для улучшения этого кода, кроме for-of и Object.values:

for (const entry of Object.values(getSearchDataAllCounts.counts)) {
  for (const key of Object.keys(entry)) {
    entry[key] = 0;
  }
}

В комментарии Вы спросили:

Так что мы не можем сделать это с одним l oop верно?

Вы можете сделать это с тем, что выглядит как один l oop, но это действительно вложенные циклы, как указано выше (на самом деле, больше циклов):

for (const [key, entry] of Object.entries(getSearchDataAllCounts.counts)) {
    getSearchDataAllCounts.counts[key] = Object.fromEntries(
      Object.keys(entry).map(key => [key, 0])
    );
}

Использует Object.entries для получения массива пар [key, value] для внешнего объекта, а затем заменяет этот объект новым объектом, который мы создаем,

  • его ключи
  • Отображение их на [key, 0] записей
  • Использование Object.fromEntries для создания объекта из этих записей

Есть важный разница там, однако: он создает новые объекты для хранения в свойствах самого внешнего объекта. Первый просто обновляет свойства существующих объектов.

0 голосов
/ 26 марта 2020

Вам не нужен ES6. Используя заменитель JSON, вы можете сделать это при обходе дерева.

Util

const zero = obj =>
   JSON.parse(JSON.stringify(obj, (_, v) => (typeof v === "object" ? v : 0)));

console.log (ноль (d ));

Как пользоваться

console.log(zero(d));

var d = {
  counts: {
    created_by_ref: {
      "00f5c303-32c0-4f5f-ac61-bf6577a8f4ed": 1,
      "0dde2de1-7951-45b1-8bf3-013f8dbfc4ae": 1
    },
    "file.hashes.MD5": {
      qqq: 200
    },
    "ipv4_addr.value": {
      "127.0.0.1": 200,
      "192.168.1.10": 200
    },
    "network_traffic.dst_port": {
      xxx: 200
    },
    "network_traffic.dst_ref.resolves_to_refs.value": {
      yyy: 200
    },
    "network_traffic.dst_ref.value": {
      rrr: 200
    }
  }
};
const zero = obj => JSON.parse(JSON.stringify(obj, (_, v) => (typeof v === "object" ? v : 0)));
console.log(zero(d));
.as-console-row {color: blue!important}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...