У меня есть объект Javascript, у которого не может быть ни одного, одного или нескольких ключей. Тогда каждый ключ имеет вложенное значение.

Примере

cart = {
    "98eb9514-f403-4d08-b5f7-dd6a5ec013cb": {
        "quantity": 1,
        "FirstName": "John",
        "LastName": "Lewis"
    },
    "92ef2918-6bc2-4f3b-b9b3-acf6ebe74b1f": {
        "quantity": 1,
        "FirstName": "Matthew",
        "LastName": "Smith"
    }
}

Мне нужно проверить, есть ли у ключа точное вложенное значение. Если это так, то мне нужно добавить 1 к количеству для этого точного ключа с этим точным вложенным значением.

Я могу проверить, существует ли точный ключ с таким точным вложенным значением, выполнив:

if (cart.hasOwnProperty(productId) &&
    cart[productId]["quantity"] >= 1 &&
    cart[productId]["FirstName"] == FirstName &&
    cart[productId]["LastName"] == LastName) {
    console.log('add one to qty somehow...')
}

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

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

Работал над этим полтора дня. Любая помощь горячо приветствуется.

0
pycode81 15 Окт 2021 в 18:28

4 ответа

Лучший ответ

Сделать это можно так:

const cart = {
"98eb9514-f403-4d08-b5f7-dd6a5ec013cb":{"quantity":1,"FirstName":"John", "LastName":"Lewis"},
"92ef2918-6bc2-4f3b-b9b3-acf6ebe74b1f":{"quantity":1,"FirstName":"Matthew", "LastName":"Smith"}
}
const productId = "92ef2918-6bc2-4f3b-b9b3-acf6ebe74b1f";
const firstName = "Matthew";
const lastName = "Smith";
const quantity = 1;

const cartItem = cart[productId];

if(typeof cartItem !== "undefined" && cartItem.FirstName === firstName && cartItem.LastName === lastName && cartItem.quantity >= 1) {
  cartItem.quantity += 1;
};

console.log(cart);

Как только вы получите указатель на предполагаемое свойство корзины, вы можете просто увеличить его свойство quantity.

1
Mario Varchmin 15 Окт 2021 в 16:01

Если вы сравниваете тысячи записей с тысячами других записей, возможно, вы захотите как-то упаковать их - однако цель здесь - избавиться от дублирования?

Если да, вы можете попробовать что-нибудь вроде ...

var cartCounter = {};
for (var itemKey in cart) {
 var item = cart[itemKey];
 var key = item.FirstName + "|" + item.LastName;
 if (!cartCounter[key]) {
  cartCounter[key] = item;
 } else {
  cartCounter[key].quantity++;
 }
}
0
Count Spatula 15 Окт 2021 в 16:04
let cart = {
    "98eb9514-f403-4d08-b5f7-dd6a5ec013cb": {
        "quantity": 1,
        "FirstName": "John",
        "LastName": "Lewis"
    },
    "92ef2918-6bc2-4f3b-b9b3-acf6ebe74b1f": {
        "quantity": 1,
        "FirstName": "Matthew",
        "LastName": "Smith"
    }
}
let productId = '98eb9514-f403-4d08-b5f7-dd6a5ec013cb'; // any product key
let valueToMAtch = 1; // any value to match

let productKey = Object.keys(cart).find((key) => key === productId);
Object.entries(cart[productKey] || {}).forEach(([key, value]) => { // || {} allows undefined handing if no product is found
    if (value === valueToMAtch) {
        cart[productKey][key] += 1; // adding one
    }
});

console.log(cart); // result
0
vaira 15 Окт 2021 в 16:13

Если вам нужно глубокое равенство на основе только перечислимых свойств (то есть значений, которые вы получаете при использовании for...of или Object.keys и т. Д.), Вы можете определить равенство на основе сериализации JSON этих объекты, при условии принудительной сортировки ключей , используя редко упоминается replacer аргумент для JSON.stringify().

Это невероятно мощная функция процесса сериализации JSON, и мы можем написать простую функцию, которая будет гарантировать, что любой объект, который мы передаем, всегда будет сериализован в одну и ту же строку JSON, независимо от порядка ключей на любой глубине:

function sortedObjectKeys(_, data) {
  // Ignore primitives.
  if (data === null) return null;
  if (typeof data !== "object") return data;

  // Also ignore iterables, which are type "object" but
  // should not be sorted because [1,2,3] is not [1,3,2].
  if (data.__proto__[Symbol.iterator]) return data;

  // Then sort the object keys and yield a new object with that
  // ordering enforced by key insertion.
  return Object.fromEntries(Object.entries(data).sort());
}

Теперь мы можем выполнить глубокий тест на равенство, используя равенство строк:

function deepEqual(o1, o2) {
  const s1 = JSON.stringify(o1, sortedObjectKeys);
  const s2 = JSON.stringify(o2, sortedObjectKeys);
  return s1 === s2;
}
0
Mike 'Pomax' Kamermans 15 Окт 2021 в 16:42