【问题标题】:Merge object to a multidimensional array based on a common value基于共同值将对象合并到多维数组
【发布时间】:2019-03-26 09:34:07
【问题描述】:

我正在寻找一种基于公共值将对象合并到数组中的方法。我的解决方案应该是动态的,这给我带来了很多麻烦。 这是一个例子:

我有一个多维数组(参见下面的代码)。它包含一个名为“Währung”的列,其中包含数值。

0: {AGIMENDO Info Objekt 1: "00000000", Beschreibung Kurz: "Test0", Währung: "200.00", __rowNum__: 1}
1: {AGIMENDO Info Objekt 1: "00000001", Beschreibung Kurz: "Update1", Währung: "456.00", __rowNum__: 2}
2: {AGIMENDO Info Objekt 1: "00000002", Beschreibung Kurz: "Test2", Währung: "12.00", __rowNum__: 3}
3: {AGIMENDO Info Objekt 1: "00000003", Beschreibung Kurz: "Test3", Währung: "549153.00", __rowNum__: 4}
4: {AGIMENDO Info Objekt 1: "00000004", Beschreibung Kurz: "Text", Währung: "1.05", __rowNum__: 5}
5: {AGIMENDO Info Objekt 1: "00000005", Beschreibung Kurz: "13.08.11", Währung: "465.00", __rowNum__: 6}
6: {AGIMENDO Info Objekt 1: "00000006", Beschreibung Kurz: "Test21", Währung: "4594.00", __rowNum__: 7}

对于每一行,我遍历每个单元格并为每个包含数字/日期值的单元格分配一个“类型”。下面的代码显示了该数组。现在我想根据公共值合并这两个数组(第一个数组是“währung”,第二个数组是“值”)。我尝试使用 lodash _.map、_.assign 等,但我不明白我想要的输出。

0: {type: "number", value: "200.00"}
1: {type: "number", value: "456.00"}
2: {type: "number", value: "12.00"}
3: {type: "number", value: "549153.00"}
4: {type: "number", value: "1.05"}
5: {type: "date", value: "13.08.11"}
6: {type: "number", value: "465.00"}

我的目标输出看起来像这样(第一行):

> 0:
>   AGIMENDO Info Objekt1: "00000000"
>   Beschreibung Kurz: "Test0" 
>   Währung:
>     Value : "200.00" 
>     Type: "number"

我如何做到这一点?

【问题讨论】:

  • 请以文本形式添加数据,而不是图像。 - 以及你所尝试的。
  • @sonja 为什么不首先修改原始数组,而不是创建然后合并。
  • @Vishnudev 第一个数组由 excel 上传创建(使用 SheetJS)。该库提供了一个函数“sheet_to_json”,它从上传的 excel 文件创建第一个数组。所以不幸的是,我无法为该创作添加任何内容..
  • @sonja 只需创建 sheetjs 输出的复制变量并执行此操作
  • 这两个数组的元素顺序是否相同?

标签: javascript arrays object multidimensional-array merge


【解决方案1】:

如果第二个数组包含具有相同值的对象,则必须遍历所有属性并替换值。

var arr1, arr2, result;

arr1 = [
  {"AGIMENDO Info Objekt 1": "00000000", "Beschreibung Kurz": "Test0", Währung: "200.00", __rowNum__: 1},
  {"AGIMENDO Info Objekt 1": "00000001", "Beschreibung Kurz": "Update1", Währung: "456.00", __rowNum__: 2},
  {"AGIMENDO Info Objekt 1": "00000002", "Beschreibung Kurz": "Test2", Währung: "12.00", __rowNum__: 3},
  {"AGIMENDO Info Objekt 1": "00000003", "Beschreibung Kurz": "Test3", Währung: "549153.00", __rowNum__: 4},
  {"AGIMENDO Info Objekt 1": "00000004", "Beschreibung Kurz": "Text", Währung: "1.05", __rowNum__: 5},
  {"AGIMENDO Info Objekt 1": "00000005", "Beschreibung Kurz": "13.08.11", Währung: "465.00", __rowNum__: 6},
  {"AGIMENDO Info Objekt 1": "00000006", "Beschreibung Kurz": "Test21", Währung: "4594.00", __rowNum__: 7}
];

arr2 = [
  {type: "number", value: "200.00"},
  {type: "number", value: "456.00"},
  {type: "number", value: "12.00"},
  {type: "number", value: "549153.00"},
  {type: "number", value: "1.05"},
  {type: "date", value: "13.08.11"},
  {type: "number", value: "465.00"}
       ]

result = arr1.map(obj=>{
  let copy = Object.assign({}, obj);
  Object.entries(obj).forEach(([key, val])=>{
    let type = arr2.find(el=>el.value === val);
    if (type){
      copy[key] = type;
    }
  })
  return copy;
})

console.log(result)

【讨论】:

    【解决方案2】:

    我不确定你是否希望 __rowNum__ 出现在输出中

    var arrA = [{'AGIMENDO Info Objekt 1': "00000000", 'Beschreibung Kurz': "Test0", 'Währung': "200.00", '__rowNum__': 1}, {'AGIMENDO Info Objekt 1': "00000001", 'Beschreibung Kurz': "Update1", 'Währung': "456.00", '__rowNum__': 2}];
    
    var arrB = [{type: "number", value: "200.00"}, {type: "number", value: "456.00"}];
    
    var resultat = arrA.map((obj, index)=>(    Object.assign(obj, {'Währung': {
         'Value': arrB[index].value,
         'Type': arrB[index].type
      }})
    ));
    
    console.log(resultat);

    【讨论】:

    • 谢谢!但不幸的是,这不是 100% 动态的。我应该动态获取列名“Währung”,因为它可能是不同的名称或不同的类型。任何想法如何工作?除此之外,它是完美的..
    • @sonja 你的意思是第一个数组中的“Währung”可能有不同的名称?
    • @evgenifotia 数组类型也包含日期,并且匹配列“Beschreibung Kurz”
    • 是的,我的 JSON 模型只是一个例子。这是一个 excel 上传,所以它可能是任何名称,也可能不存在..!
    【解决方案3】:

    这应该可以工作,因为您可以直接更新 json 数组

    json_arr = [{"AGIMENDO Info Objekt 1": "00000000", "Beschreibung Kurz": "Test0", "Währung": "200.00", "__rowNum__": 1},
     {"AGIMENDO Info Objekt 1": "00000001", "Beschreibung Kurz": "Update1", "Währung": "456.00", "__rowNum__": 2}]
    
    function update_type(json_arr, column_name) {    
        for(var i=0; i<json_arr.length; i++){
            element = json_arr[i][column_name];
            json_arr[i][column_name] = {};
            json_arr[i][column_name]['value'] = element;
            json_arr[i][column_name]['type'] = get_type(json_arr[i][column_name]); /* Here comes your type checking function */
       }
       return json_arr
    }
    console.log(update_type(json_arr, "Währung"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-13
      • 2021-07-06
      • 2016-10-25
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      相关资源
      最近更新 更多