【问题标题】:I have a data and want to map all the elements to other elements我有一个数据,想将所有元素映射到其他元素
【发布时间】:2019-11-28 05:29:03
【问题描述】:
[
    {
        "clauseId": 1,
        "clauseName": "cover",
        "texts": [
            {
                "textId": 1,
                "text": "hello"
            }
        ]
    },
    {
        "clauseId": 3,
        "clauseName": "xyz",
        "texts": [
            {
                "textId": 3,
                "text": "hello Everyone"
            },
            {
                "textId": 4,
                "text": "Some data"
            }
        ]
    }
 {
        "clauseId": 2,
        "clauseName": "joining",
        "texts": [
            {
                "textId": 3,
                "text": "hello1"
            },
            {
                "textId": 4,
                "text": "hello2"
            }
        ]
    }
]

如果我列一个像

这样的列表
a=[joining,cover]

我想要一个新的列表形成为

b=[hello1,hello2,hello]

请注意,每个元素的索引都很重要如果我反转索引

b =[hello,hello1,hello2]

如果

a=[xyz,joining,cover]
b=["hello Everyone","Some data",hello1,hello2,hello]

类似如果我在 [joining,xyz,cover] 中交换位置

b=["hello1","hello2","hello Everyone","Some data",hello]

请注意,传入的数据可以有多个clauseName和多个文本。这只是一个演示

【问题讨论】:

标签: javascript arrays angular typescript list


【解决方案1】:

您可以使用Map 从原始数组创建查找表。该地图将使用每个clauseName 作为键并指向一个文本数组作为值。然后,您可以将您的子句数组.flatMap() 设置为查找表中每个键的值(即Map)。

请看下面的例子:

const arr=[{clauseId:1,clauseName:"cover",texts:[{textId:1,text:"hello"}]},{clauseId:3,clauseName:"xyz",texts:[{textId:3,text:"hello Everyone"},{textId:4,text:"Some data"}]},{clauseId:2,clauseName:"joining",texts:[{textId:3,text:"hello1"},{textId:4,text:"hello2"}]}];

const clauses = ["joining", "cover"];
const lut = new Map(arr.map(({clauseName, texts}) => 
  [clauseName, texts.map(({text}) => text)]
));

const result = clauses.flatMap(key => lut.get(key));
console.log(result);

如果你不能使用 JS 的原生 .flatMap 实现,你可以 polyfill 或者使用 lodash 的实现:

const arr = [{clauseId:1,clauseName:"cover",texts:[{textId:1,text:"hello"}]},{clauseId:3,clauseName:"xyz",texts:[{textId:3,text:"hello Everyone"},{textId:4,text:"Some data"}]},{clauseId:2,clauseName:"joining",texts:[{textId:3,text:"hello1"},{textId:4,text:"hello2"}]}];

const clauses = ["joining", "cover"];
const lut = new Map(arr.map(({clauseName, texts}) => 
  [clauseName, texts.map(({text}) => text)]
));

const result = _.flatMap(clauses, key => lut.get(key));
console.log(result);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

【讨论】:

  • 出现错误,因为数据类型字符串@Nick Parsons 上不存在平面地图
  • 在示例中,我在数组上使用.flatMap,仔细检查您是否在数组上使用.flatMap(听起来您正试图在字符串上调用它)
  • 我检查了它显示相同的错误@Nick Parsons
  • @adityamishra 如果不看您如何尝试使用它,很难说出问题所在。我唯一能想到的是您使用的浏览器不支持.flatMap()(但是,如果是这种情况,我希望会出现不同的错误)。如果您的浏览器不支持 .flatMap(),您可以使用 lodashes _.flatMap()(我相信您在使用 angular 时可以访问它 - 如果没有,您可以随时安装它)。我已经更新了我的答案以包含一个代码 sn-p 使用 lodashes 版本的_.flatMap()
  • 感谢@Nick Parsons ..只需更新 ts.config.json 中的 lib
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 2020-12-11
  • 2022-12-22
  • 1970-01-01
相关资源
最近更新 更多