如何用javascript中的旧对象制作新对象?

时间:2019-05-14 09:11:07

标签: javascript reactjs

因此,基本上我的目标是获取带有字符串值的对象,转换值并创建一个包含已转换字符串的新对象。所以说我是否有

const strings = {
    "name": "my name",
    "age": "my age"
}

我想翻译一下,所以我有一个新的对象,例如:

const translated = {
    "name": "mi nombre",
    "age": "mi edad"
}

我尝试使用map函数,但还没有真正使任何东西都能正常工作。另外,我不确定如何只翻译对象的值而不翻译标签。有人有什么建议吗?我不担心执行翻译的逻辑,我正在使用AWS Translation,而该操作必须提供一个字符串。

我当前的文件:

import AWS from 'aws-sdk';
import uuid from 'uuid';
const translate = new AWS.Translate({apiVersion: '2019-01-01'});
import * as dynamoDbLib from "./libs/dynamodb-lib";
import { success, failure } from "./libs/response-lib";


export async function main(event, context) {
  try {

    const data = JSON.parse(event.body);

    const toTranslate = {
        SourceLanguageCode: 'auto', /* required */
        TargetLanguageCode: data.TargetLanguageCode, /* required */
        Text: data.Text, /* required */
    };

    const translated = await translate.translateText(toTranslate).promise();

    console.log(translated);

    const params = {
        "TableName": "sites",
        "Item": {
            "userId": "1",
            "siteId": uuid.v1(),
            "Language": translated.TargetLanguageCode,
            "SiteName": translated.TranslatedText,
            "CreatedAt": Date.now()
        }
    }

    try {
        await dynamoDbLib.call("put", params);
        return success(params.Item);
    } catch (e) {
        console.log(e);
        return failure({ status: false });
    }


  } catch (err) {
    console.log(err, err.stack);
  } 
}

尝试:

const data = JSON.parse(event.body);

    function translate(toTranslate) {
      const translated = await translate.translateText(toTranslate).promise();
    }

    const translated = {};
    const promises = Object.keys(data.Text).map(key =>
      translate(data.Text[key], data.TargetLanguageCode).then(translation =>
        translated[key] = translation
      )
    );
    Promise.all(promises).then(() => translationsAreReady(translated));

3 个答案:

答案 0 :(得分:0)

假设translate(term: String, lang: String)是您的翻译功能,则映射方式如下:

const strings = {
    "name": "my name",
    "age": "my age"
}

let lang = "es";

const translated = {...strings};
for (const key in translated) {
  translated[key] = translate(translated[key], lang);
}

答案 1 :(得分:0)

const translated = {};
Object.keys(strings).forEach(key => {
  translated[key] = translate_sync(strings[key], lang);
});

但是,同步translate可能不可用,所以...

const translated = {};
const promises = Object.keys(strings).map(key =>
  translate_promise(strings[key], lang).then(translation =>
    translated[key] = translation
  )
);
Promise.all(promises).then(() => translationsAreReady(translated));

答案 2 :(得分:0)

可以通过Object.entries()Array.reduce()来实现,如下所示。另请注意,使用Promise.all()来将对异步函数translate.translateText()的多路调用解析为translatedEntries的数组,从中构造新的translated

/* Input object */
const strings = {
  "name": "my name",
  "age": "my age"
}

/* A mock of your translation function/library */
const translate = {
  translateText: async(value) => {
    if (value === 'my name') return "mi nombre";
    if (value === 'my age') return "mi edad";
    return "?"
  }
}

Promise.all(Object.entries(strings).map(async([key, value]) => {

  /* Map all entries to a promise that resolves each translation request
  asynchronously */
  const translation = await translate.translateText(value);

  /* Map translation result for this entry */
  return [key, translation];

})).then((translatedEntries) => {
  
  /* Construct a new object from key/value pairs in translated entries */
  return translatedEntries.reduce((result, [key, value]) => {
    return { ...result,
      [key]: value
    }
  }, {})

}).then((translated) => {
  
  console.log(translated);
});