#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 }]}