如果数组的对象在Javascript中包含多个逗号分隔的值,则复制整个数组
我有一个嵌套数组,其中包含对象如果数组的对象在Javascript中包含多个逗号分隔的值,则复制整个数组,javascript,arrays,Javascript,Arrays,我有一个嵌套数组,其中包含对象docs,我首先将其展平到一个级别。 我还有另一个平面数组,叫做multiValueSelected 现在,我想遍历展平的文档-数组的所有对象,并检查键是否也在多值选定的-数组中 如果是这样,我想为特定键的每个逗号分隔值复制整个docs-数组,复制所有其他对象,并将新的doc添加到表中 使用下面的方法,我可以遍历所有逗号分隔的值,但是如何复制整个文档-array?谢谢你的帮助 示例数组: function importTableau(docs, table) {
docs
,我首先将其展平到一个级别。
我还有另一个平面数组,叫做multiValueSelected
现在,我想遍历展平的文档
-数组的所有对象,并检查键是否也在多值选定的
-数组中
如果是这样,我想为特定键的每个逗号分隔值复制整个docs
-数组,复制所有其他对象,并将新的doc
添加到表中
使用下面的方法,我可以遍历所有逗号分隔的值,但是如何复制整个文档
-array?谢谢你的帮助
示例数组:
function importTableau(docs, table) {
var data = [];
var importedDocs = 0;
for (var i = 0; i < docs.length; i++) {
var flatten = objectFlattenData(docs[i])
var rec = {}
for (var key in flatten) {
// var key deiines the KEY
// var flatten[key] defines the VALUE without duplicates
// var flatten defines the CURRENT DOCUMENT
if (multiValueSelected.indexOf(key) > -1) {
//console.log('key: ', key, ' flatten: ', flatten[key])
var flattenString = flatten[key];
var id = key.replace(/[^A-Za-z0-9_]+/g, '')
// handling multivalues as seperate doc per value
var properties = flattenString.split(',');
var propertiesLength = properties.length;
for (var i = 0; i < propertiesLength; i++) {
// Trim the excess whitespace.
properties[i] = properties[i].replace(/^\s*/, "").replace(/\s*$/, "");
// Get the single Value
var singleValue = properties[i]
console.log(singleValue);
rec[id] = flatten[singleValue];
data.push(rec);
}
return false;
} else {
// not selected for handling multivalues as seperate doc
var id = key.replace(/[^A-Za-z0-9_]+/g, '')
rec[id] = flatten[key];
};
};
data.push(rec);
};
table.appendRows(data);
文档[{“id”:“test1”,“color”:“green,blue,grey”,“size”:“s,m”},{“id”:“test2”,“color”:“green”,“size”:“l”}……]
多值选择{“颜色、大小,…”}
数据的预期结果:
1. {"id" : "test1", "color" : "green", "size" : ""}
2. {"id" : "test1", "color" : "blue", "size" : ""}
3. {"id" : "test1", "color" : "grey", "size" : ""}
4. {"id" : "test1", "color" : "", "size" : "s"}
5. {"id" : "test1", "color" : "", "size" : "m"}
6. {"id" : "test2", "color" : "green", "size" : "l"}
脚本:
function importTableau(docs, table) {
var data = [];
var importedDocs = 0;
for (var i = 0; i < docs.length; i++) {
var flatten = objectFlattenData(docs[i])
var rec = {}
for (var key in flatten) {
// var key deiines the KEY
// var flatten[key] defines the VALUE without duplicates
// var flatten defines the CURRENT DOCUMENT
if (multiValueSelected.indexOf(key) > -1) {
//console.log('key: ', key, ' flatten: ', flatten[key])
var flattenString = flatten[key];
var id = key.replace(/[^A-Za-z0-9_]+/g, '')
// handling multivalues as seperate doc per value
var properties = flattenString.split(',');
var propertiesLength = properties.length;
for (var i = 0; i < propertiesLength; i++) {
// Trim the excess whitespace.
properties[i] = properties[i].replace(/^\s*/, "").replace(/\s*$/, "");
// Get the single Value
var singleValue = properties[i]
console.log(singleValue);
rec[id] = flatten[singleValue];
data.push(rec);
}
return false;
} else {
// not selected for handling multivalues as seperate doc
var id = key.replace(/[^A-Za-z0-9_]+/g, '')
rec[id] = flatten[key];
};
};
data.push(rec);
};
table.appendRows(data);
函数导入表(文档、表格){
var数据=[];
var importedDocs=0;
对于(变量i=0;i-1){
//log('key:',key,'flatten:',flatten[key])
var FlattString=展平[键];
var id=键。替换(/[^A-Za-z0-9_33;]+/g')
//将多值作为每个值的单独文档处理
var properties=flattString.split(',');
var propertiesLength=properties.length;
对于(变量i=0;i
我真的不明白这个问题,但是如果你想知道:
输入:docs[{“id”:“test1”,“color”:“green,blue,grey”,“size”:“s,m”},{“id”:“test2”,“color”:“green”,“size”:“l”}……]
输出:多值选择[“颜色,大小,…”,“…”]
作为输出,您不能有[{“color,size,…”}],因为它不是有效的json,json是键值对的组合,而不仅仅是字符串
您可以这样做:
const docs = [{"id" : "test1", "color" : "green,blue,grey", "size" : "s,m"}, {"id" : "test2", "color" : "green", "size" : "l"}...];
const multiValueSelected = [];
docs.forEach(doc => {
let currentValue = "";
Object.keys(doc).forEach(key => {
if(doc[key].split(',').length > 1)
currentValue = (currentValue === "") ? key : ", " + key;
}
if(currentValue !== "") multiValueSelected.push(currentValue);
}
如果要将此[{“颜色”:“绿色、蓝色、灰色”、“大小”:“s、m”}、{“…”:“…”、…}]作为输出
如果我没有回答你的问题,请告诉我我真的不理解这个问题,但是如果你想回答这个问题: 输入:docs[{“id”:“test1”,“color”:“green,blue,grey”,“size”:“s,m”},{“id”:“test2”,“color”:“green”,“size”:“l”}……] 输出:多值选择[“颜色,大小,…”,“…”] 作为输出,您不能有[{“color,size,…”}],因为它不是有效的json,json是键值对的组合,而不仅仅是字符串 您可以这样做:
const docs = [{"id" : "test1", "color" : "green,blue,grey", "size" : "s,m"}, {"id" : "test2", "color" : "green", "size" : "l"}...];
const multiValueSelected = [];
docs.forEach(doc => {
let currentValue = "";
Object.keys(doc).forEach(key => {
if(doc[key].split(',').length > 1)
currentValue = (currentValue === "") ? key : ", " + key;
}
if(currentValue !== "") multiValueSelected.push(currentValue);
}
如果要将此[{“颜色”:“绿色、蓝色、灰色”、“大小”:“s、m”}、{“…”:“…”、…}]作为输出
如果我没有回答您的问题,请告诉我,您的预期结果似乎有点混乱,但也许这就是您想要的
let docs=[{
“id”:“test1”,
“颜色”:“绿色、蓝色、灰色”,
“尺寸”:“s,m”
}, {
“id”:“test2”,
“颜色”:“绿色”,
“尺寸”:“l”
}];
让多值选择=[“颜色”,“大小”];
让数据=[];
for(多值选择的选定值){
用于(文档中的文档){
if(文档hasOwnProperty(选定值)){
let values=doc[所选值].split(',');
对于(值的值){
设obj={id:doc.id};
让keys=Object.keys(doc).filter(k=>!['id',所选的_值].includes(k));
key.map(k=>obj[k]='');
obj[所选的_值]=值;
数据推送(obj);
}
}
}
}
console.log(data)
您的预期输出似乎有点混乱,但这可能就是您想要的
let docs=[{
“id”:“test1”,
“颜色”:“绿色、蓝色、灰色”,
“尺寸”:“s,m”
}, {
“id”:“test2”,
“颜色”:“绿色”,
“尺寸”:“l”
}];
让多值选择=[“颜色”,“大小”];
让数据=[];
for(多值选择的选定值){
用于(文档中的文档){
if(文档hasOwnProperty(选定值)){
let values=doc[所选值].split(',');
对于(值的值){
设obj={id:doc.id};
让keys=Object.keys(doc).filter(k=>!['id',所选的_值].includes(k));
key.map(k=>obj[k]='');
obj[所选的_值]=值;
数据推送(obj);
}
}
}
}
console.log(数据)
一些简化的示例数据和预期的结果对于理解您评论的问题非常有用。我编辑了一些简化的示例数据和预期的结果对于理解您评论的问题非常有用。我编辑了您回复的问题!multiValueSelected是一个简单的数组,抱歉。此数组包含docs数组的可能对象键。如果docs数组包含一个包含在multiValueSelected中定义的键的对象,那么我想检查它的值以及对象中有多少逗号分隔的值。对于每个逗号分隔的值,我想添加一个新的doc,并保留所有其他键