Как добавить новую пару ключ: значение в уже существующую переменную состояния массива - PullRequest
0 голосов
/ 08 мая 2019

У меня есть функция базы данных, которая возвращает несколько строк из базы данных sqlite и сохраняет их в состоянии

rows = await ReturnSelectedSymbolsDB()
this.setState({ symbols: rows })

Массив выглядит примерно так

symbols: [{key: "0", symbol:"name1", active: false},{key:"1", symbol:"name2",active: false}]

У меня есть другая функция базы данных, которая возвращает несколько строк, и я хочу добавить их к symbol, чтобы это выглядело так.

symbols: [{key: "0", symbol:"name1", active: false, newKey: newValue},{key:"1", symbol:"name2",active: false, newKey, newValue2}]

Вторая функция вернет несколько строк из базы данных, что будет легко сопоставить с symbols в качестве символов: символ будет соответствовать otherFunction: символ.

Обычно вы просто пишете это как обычный SQL-запрос с внутренним объединением, объединяющим две таблицы, а затем просто помещаете результирующие строки в переменную состояния, но я не могу в этом случае и должен строить переменную состояния по частям.

Можно ли это сделать обычным javascript?

EDIT: Вероятно, не ясно, но newKey может иметь различные значения в зависимости от того, как называется symbol

Ответы [ 4 ]

1 голос
/ 08 мая 2019

Вы должны вставить новое значение в ваш первый массив функций, есть несколько способов, которыми можно вставить объект в массив, либо использовать для цикла , либо в массиве манипулирование функциями.

var arrOfObj = [{
  key: "0", 
  symbol:"name1", 
  active: false
}, {
  key: "1", 
  symbol:"name1", 
  active: false
}, {
  key: "2", 
  symbol:"name1", 
  active: false
}];

var result = arrOfObj.map(function(o) {
  o.newKey = newValue;
  return o;
})

console.log(result)

Примечание. Я бы предпочел использовать внутреннее объединение с двумя таблицами, чтобы получить объединенный массив, который не требует каких-либо манипуляций с массивом.

1 голос
/ 08 мая 2019

Вы можете создать новую функцию утилит, где вы можете добавить новый ключ ко всем объектам в массиве.

addKey(symbol) {
   let newArray=[...symbol];
   return newArray.map((ele, i) => {
      return {...ele, newKey: newValue};
   })
}

Happy Coding:)

0 голосов
/ 08 мая 2019

Попробуйте,

let symbols = [
  { key: "0", symbol: "name1", active: false },
  { key: "1", symbol: "name2", active: false }
];
let newSymbols = [
  { key: "1", symbol: "name1", newKey: "fdds" },
  { key: "0", symbol: "name2", newKey: "sadav" }
];

mergeArray = (arrayOld, arrayNew) => {
  let output = arrayOld.filter(item => {
    let find = findMatchingItem(arrayNew, item.key);
    item["newKey"] = find.newKey;
    return item;
  });
  return output;
};

findMatchingItem = (array, matchingItemKey) => {
  let output = null;
  array.map(item => {
    if (item.key == matchingItemKey) {
      output = item;
    }
  });
  return output;
};

let newArray = mergeArray(symbols, newSymbols);
console.log(newArray);

Я сопоставил объекты, используя "key", если вы хотите от "symbol", просто измените "key" на "symbol"

0 голосов
/ 08 мая 2019

Вы можете сделать что-то подобное, если знаете значение ключа, соответствующее данному символу:

for (let i = 0; i < symbols.length; i++){
    symbols[i].newKey = "anyValue"
}
...