Получите ключ в объекте JavaScript по его значению и переименуйте его

#javascript

Вопрос:

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

Допустим, это список переменных

 customer1 = "Jack", customerDate1 = "08/13/2021", customer2 = "Michael", customerDate2 = "01/01/2021", customer3 = "Luna",customerDate3 = "03/10/2021";
 

Массив перед проверкой состояния выполнения будет

 data = [{key1:"Jack", keyDate1:"08/13/2021",key2:"Michael", keyDate2:"01/01/2021",key3:"Luna", keyDate3:"10" }];
 

Допустим, условие таково:

Имя пользователя = «Джек»;

Мне нужна переменная CustomerName для перекрестной проверки со следующими переменными (customer1,customer2,customer3), и если условие удовлетворяет любому из них, то их ключи в массиве изменяются:

например, условие удовлетворяет customer1, затем оба ключа customer1 и customerDate1 изменяются на что-то другое, чтобы стать чем-то вроде

 data = [{conditionMet1:"Jack", conditionDateMet1:"08/13/2021",key2:"Michael", keyDate2:"01/01/2021",key3:"Luna", keyDate3:"10" }];
 

Я ценю любую помощь или руководство.

Комментарии:

1. предлагаю вам поделиться образцами данных/входных данных и ожидаемыми результатами, нам будет легче понять ваш вопрос, а также пробовали ли вы вообще какое-либо решение?

2. данные представляют собой массив только с одним объектом ?

3. почему вы хотите это сделать !!!!?

4. @Isaac Я добавил некоторые данные в код. Да, я пробовал перебирать условия, но я хочу, чтобы это было в виде функции, иначе код будет таким длинным

5. @nAviD Я пытаюсь сохранить эти данные на сервере, но перед этим имена ключей должны измениться, чтобы позже можно было извлекать данные с сервера

Ответ №1:

Немного сложнее, чем algoritm, но это работает:

 let data = [{key1:"Jhon", keyDate1:"08/13/2021",key2:"Eric", keyDate2:"01/01/2021",key3:"Jack", keyDate3:"10" }];

let i = 1;
let result = [];
let explored = [];
data.forEach(x => {
   let resultObj = {};
   for (const [key, val] of Object.entries(x)) {
      let newKey = key;
      let newKeyDate = null;
      if (val === "Jack") {
          newKey = "conditionMet"   i;
          newKeyDate = "conditionDateMet"   i;
      }
      if (!explored.includes(key)) resultObj[newKey] = val;
      if (newKeyDate) {
         resultObj[newKeyDate] = x["keyDate"   i];
         explored.push("keyDate"   i)
      }
      if(!key.includes("Date")) i  ;
   }
   result.push(resultObj)
})
console.log(result) 

В основном для каждого элемента data я исследую все entries , и если я нашел условие, я добавляю conditionMet1 и conditionDateMet1 к объекту, в противном случае то, что я нашел на самом объекте.

Комментарии:

1. Извините, вы не могли бы еще раз проверить код? Если я проверю положение условия, которое должно быть выполнено, например, переместив «Гнездо» на клавишу 2 или клавишу 3, это даст неправильный результат?

2. @ZeroByZero я проверяю

3. @ZeroByZero готово! i значение должно быть увеличено только в том случае, если !key.includes("Date") . Я обновил свой ответ

Ответ №2:

Возможно, не очень элегантно, но для приведенного примера вы могли бы сделать что-то подобное:

 if(specialCondition){
  data = [{specialKey1:customer1, specialDate1:customerDate1,key2:customer2...];
}else{
  data = [{key1:customer1, keyDate1:customerDate1,key2:customer2...];
}
 

Ответ №3:

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

 object["newKeyName"] = object.previousKey
 

И при желании вы можете удалить старый ключ,

 delete object.previousKey
 

Таким образом, вы удалите предыдущий ключ, если он вам больше не нужен.

Ответ №4:

Допустим, у вас есть 6 переменных.

 customer1, customerDate1, customer2, customerDate2, customer3,customerDate3;
 

Вы могли бы создать массив по желанию заказчика

 const data = [{
  id: customer1,
  date: customerDate1
},{
  id: customer2,
  date: customerDate2
},{
  id: customer3,
  date: customerDate3
}];
 

Это сейчас весьма полезно. Допустим, вы хотите знать, какой клиент соответствует какому-то условию. (например id , «Джек»), используя массив.найти

 const jack = data.find(item => item.id === "Jack");
console.log(jack);
 

Или чтобы узнать, у каких клиентов есть дата до «сейчас», используя Array.filter

 const now = Date.now();
const beforeNow = data.filter(item => item.date < now);
console.log(beforeNow);
 

Комментарии:

1. Спасибо вам за код. Извините, я забыл упомянуть, что эти данные будут отправлены для сохранения в базу данных на сервере в том же месте. Например, профиль клиента. Наличие ключей с одинаковыми именами всегда будет переопределять последние значения и в конечном итоге сохранит один идентификатор, одну дату, пока я пытаюсь сохранить все 3

2. @ZeroByZero это требование требует гораздо большего объяснения в исходном вопросе. Это не похоже ни на одну базу данных, о которой я когда-либо слышал, чтобы делать то, что вы описываете (переопределение последних значений). Могут ли «значения» не быть просто массивом? или объект, содержащий массив? Нравится {dont_mess_with_my_data: [{ id: customer1, date: customerDate1 },{ id: customer2, date: customerDate2 },{ id: customer3, date: customerDate3 }]}