Javascript Как обновить значение в массиве на основе совпадения значения в другом массиве - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь найти способ взять строку и обновить значения, основываясь на новой поступающей строке. Строка представляет структуру таблицы и содержит имя столбца и тип данных столбца.

Для этого я пытаюсь преобразовать исходную строку и новую строку в массивы. Затем мне нужно объединить результаты, но обновить существующие столбцы с их новыми типами данных.

Например, в приведенном ниже примере я хочу вернуть 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 bit "

Ответы [ 3 ]

1 голос
/ 20 марта 2020

Я бы создал его объекты, затем использовал бы 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);
1 голос
/ 20 марта 2020

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(','));
1 голос
/ 19 марта 2020
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...