Хорошо, я думаю, это то, что вы намеревались:
function countOutlets(obj)
{
let objUnique= obj.outlet.filter(function(item, index){
return obj.outlet.indexOf(item) >= index;
});
return objUnique
}
var cpy = [{
"billdate": "2018-09-02",
"outlet": "JAYANAGAR",
"Total": 511153,
"cash": 490289,
"creditcard": 0,
"coupon": 0,
"paytm": 0,
"credit": 0,
"swiggy": 20864,
"kb": 0,
"bigbasket": 0
},
{
"billdate": "2018-09-02",
"outlet": "MALLESHWARAM",
"Total": 115704,
"cash": 112854,
"creditcard": 0,
"coupon": 0,
"paytm": 0,
"credit": 0,
"swiggy": 2850,
"kb": 0,
"bigbasket": 0
},
{
"billdate": "2018-09-02",
"outlet": "KOLAR",
"Total": 83597,
"cash": 83597,
"creditcard": 0,
"coupon": 0,
"paytm": 0,
"credit": 0,
"swiggy": 0,
"kb": 0,
"bigbasket": 0
},
{
"billdate": "2018-09-03",
"outlet": "JAYANAGAR",
"Total": 167421,
"cash": 167421,
"creditcard": 0,
"coupon": 0,
"paytm": 0,
"credit": 0,
"swiggy": 0,
"kb": 0,
"bigbasket": 0
},
{
"billdate": "2018-09-03", //here for billdate 2018-09-03 i don't have data for malleshwaram so i want to have output as 0 when i am formating the json
"outlet": "KOLAR",
"Total": 53775,
"cash": 53775,
"creditcard": 0,
"coupon": 0,
"paytm": 0,
"credit": 0,
"swiggy": 0,
"kb": 0,
"bigbasket": 0
}
]
function getDataList(jsn) {
var billdate = [];
var outlet = [];
var SalesType = [];
billdate = [...new Set(jsn.map(ele => ele.billdate))];
outlet = [...new Set(jsn.map(ele => ele.outlet))];
for (let i in jsn[0]) {
if (i !== 'billdate' && i !== 'outlet') {
SalesType.push(i)
}
}
return {
billdate,
outlet,
SalesType
}
}
function structureJSON(obj) {
let alloutlets=countOutlets(getDataList(cpy))
console.log("billdarte :-" + obj.billdate)
var arr = [];
obj.billdate.forEach((ele1, index1) => {
obj.SalesType.forEach((ele, index) => {
let row;
if (index === 0) {
row = {
billdate: ele1,
SalesType: ele
};
} else {
row = {
billdate: "",
SalesType: ele
};
}
alloutlets.forEach((ele2, index2) => {
var selected = cpy.filter((ele3, index3) => {
return ele3.billdate === ele1 && ele3.outlet == ele2
});
if(selected.length!=0)
row[ele2] = selected[0][ele]
else
row[ele2] = "0";
})
arr.push(row)
})
})
return arr;
}
var tableValue = structureJSON(getDataList(cpy))
console.log(tableValue)
Я понимаю, что мои countOutlets вроде бы избыточны, но к тому времени, когда я понял это, я уже сделал это.
Надеюсь, это поможет.
Я должен сделать парсинг ответа по электронной почте о проекте, над которым я сейчас работаю. В итоге я использовал сопоставление с образцом для идентификации части ответа, поэтому пользователям не нужно было беспокоиться о том, куда вставить свой ответ.
Хорошая новость заключается в том, что реализация действительно не так уж сложна. Сложная часть - это просто протестировать все почтовые клиенты и сервисы, которые вы хотите поддерживать, и выяснить, как определить каждого из них. Как правило, вы можете использовать либо идентификатор сообщения, либо заголовок X-Mailer или Return-Path, чтобы определить, откуда пришло входящее письмо.
Вот метод, который принимает объект TMail, извлекает часть ответа из сообщения и возвращает вместе с почтовым клиентом / сервисом, с которого оно было отправлено. Предполагается, что у вас есть исходное сообщение От: имя и адрес в константах FROM_NAME
и FROM_ADDRESS
.
def find_reply(email)
message_id = email.message_id('')
x_mailer = email.header_string('x-mailer')
# For optimization, this list could be sorted from most popular to least popular email client/service
rules = [
[ 'Gmail', lambda { message_id =~ /.+gmail\.com>\z/}, /^.*#{FROM_NAME}\s+<#{FROM_ADDRESS}>\s*wrote:.*$/ ],
[ 'Yahoo! Mail', lambda { message_id =~ /.+yahoo\.com>\z/}, /^_+\nFrom: #{FROM_NAME} <#{FROM_ADDRESS}>$/ ],
[ 'Microsoft Live Mail/Hotmail', lambda { email.header_string('return-path') =~ /<.+@(hotmail|live).com>/}, /^Date:.+\nSubject:.+\nFrom: #{FROM_ADDRESS}$/ ],
[ 'Outlook Express', lambda { x_mailer =~ /Microsoft Outlook Express/ }, /^----- Original Message -----$/ ],
[ 'Outlook', lambda { x_mailer =~ /Microsoft Office Outlook/ }, /^\s*_+\s*\nFrom: #{FROM_NAME}.*$/ ],
# TODO: other email clients/services
# Generic fallback
[ nil, lambda { true }, /^.*#{FROM_ADDRESS}.*$/ ]
]
# Default to using the whole body as the reply (maybe the user deleted the original message when they replied?)
notes = email.body
source = nil
# Try to detect which email service/client sent this message
rules.find do |r|
if r[1].call
# Try to extract the reply. If we find it, save it and cancel the search.
reply_match = email.body.match(r[2])
if reply_match
notes = email.body[0, reply_match.begin(0)]
source = r[0]
next true
end
end
end
[notes.strip, source]
end
Я думаю, вы застрянете на этом. Недавно я самостоятельно занимался электронной почтой в TMail, и вы, как правило, обнаружите, что электронная почта, содержащая часть HTML, обычно имеет такую структуру:
part 1 - multipart/mixed
sub part 1 - text/plain
sub part 2 - text/html
end
Почтовые клиенты, с которыми я играл в Outlook и Gmail, генерируют ответы в этот формат, и они просто обычно цитируют оригинальное письмо, встроенное в ответ. Сначала я подумал, что «старые» части исходного письма будут отдельными частями, но на самом деле это не так - старая часть просто объединяется с ответной частью.
Вы можете найти в этой строке строку, которая начинается » От: '(поскольку большинство клиентов обычно размещают заголовок в верхней части исходного текста сообщения электронной почты с указанием того, кто его отправил и т. Д.), Но это, вероятно, не гарантировано.
Я не знаю "