【问题标题】:Javascript How to update value in array based on matching value in different arrayJavascript如何根据不同数组中的匹配值更新数组中的值
【发布时间】:2020-07-01 00:42:54
【问题描述】:

我正在尝试找出一种方法来获取字符串并根据传入的新字符串更新值。字符串表示表的结构并包含列名和列数据类型。

为此,我尝试将原始字符串和新字符串转换为数组。然后我需要合并结果,但使用新数据类型更新现有列。

例如,在下面的示例中,我想返回 4 列,其中 col2 从 varchar(30 更新为 varchar(20)。

var original_schema = 'col1 int,col2 varchar(30),col3 datetime2,col5 bit';
var new_schema = 'col1 int,col2 varchar(20),col3 datetime2,col4 int';

var arr_original_schema = original_schema.replace(/ /g,':').split(",");
var arr_new_schema = new_schema.replace(/ /g,':').split(",");

console.log(arr_original_schema);
console.log(arr_new_schema);

function arrayUnique(array) {
    var a = array.concat();
    for(var i=0; i<a.length; ++i) {
        for(var j=i+1; j<a.length; ++j) {           
            //removed
          if(a[i] === a[j])            
                a.splice(j--, 1);
        }
    }

    return a;
}

var uniqueschema = arrayUnique(arr_original_schema.concat(arr_new_schema));
console.log(uniqueschema)

预期结果是: col1 int,col2 varchar(20),col3 datetime2,col4 int,col5 位"

【问题讨论】:

  • 请添加最终预期结果示例
  • 谢谢,我添加了我的预期结果。

标签: javascript arrays object


【解决方案1】:

我会创建它的对象,然后使用 Object.assign

const original_schema = 'col1 int,col2 varchar(30),col3 datetime2,col5 bit';
const new_schema = 'col1 int,col2 varchar(20),col3 datetime2,col4 int';

const objectify = (string) => string.split(',').reduce((a, b) => {
    const [col, type] = b.split(/\s+/);
    a[col] = type;
    return a;
}, {});

const os = objectify(original_schema);
const ns = objectify(new_schema);

const res = Object.entries(Object.assign(os, ns)).map(e => e.join(' ')).join(',');
console.log(res);

【讨论】:

    【解决方案2】:
    var original_schema = 'col1 int,col2 varchar(30),col3 datetime2';
    var new_schema = 'col1 int,col2 varchar(20),col3 datetime2,col4 int';
    
    
    const arr_1 = original_schema.split(',');
    const arr_0 = (new Array(arr_1.length)).fill(null);
    let arr_2 = new_schema.split(',')
    arr_2=Object.assign(arr_0, arr_2)
    
    const result =  arr_2.filter(function (el) {
      return el != null;
    }).join(',')
    
    console.log(result);
    

    【讨论】:

    • 这无法正确合并模式; a 中不在 b 中的属性不会被执行。
    • “例如,在下面的示例中,我想返回 4 列,其中 col2 从 varchar(30 更新为 varchar(20)。”他不想要联合他想要覆盖...
    • 我说的是不在b 中的属性。在示例中,b 中有一个额外的列,但是将两者互换,因此a 中有一个额外的列,而 b 中不存在。例如,"a int, b int" 和 "a float" 我们应该得到 "a float, b int"。
    • 我的 sn-p 结果是“col1 int,col2 varchar(20),col3 datetime2,col4 int”,这是问题的预期结果。不是吗?
    • 是的,它适用于该输入,但在上述情况下失败。
    【解决方案3】:

    const original_schema = 'col1 int,col2 varchar(30),col3 datetime2,col5 bit';
    const new_schema = 'col1 int,col2 varchar(20),col3 datetime2,col4 int';
    
    const originalArr = original_schema.split(",");
    const newArr = new_schema.split(",");
    
    // Create single array with duplicates
    const mergedArray = [...originalArr, ...newArr];
    
    // Run through merged array with duplicates and create/overwrite existing values
    let mergedObj = mergedArray.reduce((acc, item) => {
      let [id, str] = item.split(' ');
      acc[id] = item;
      return acc;
    }, {});
    
    // sort the values of object using local compare
    // Assume that each value always start with col and number and they should be ordered as such.
    // use localCompare to compre these values.
    let sorted = Object.values(mergedObj).sort((a, b) => a.localeCompare(b));
    
    console.log(sorted.join(','));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 2018-10-31
      相关资源
      最近更新 更多