【问题标题】:Javascript make arraypairs to key index listJavascript使数组对键索引列表
【发布时间】:2019-04-27 09:39:10
【问题描述】:

我有如下所示的数组对列表:

0: [0, "535222325"]
1: [1, "346362534"]
2: [0, "534534646"]
3: [1, "745354367"]
    ^ <--- Index for array where to append value

如何通过第一个值(即索引键)将其转换为如下所示的列表

0: ["535222325","534534646"]
1: ["346362534","745354367"]
^ <--- Unique index found from array above

或者在for循环中找到具有匹配索引的值时如何附加到键中

我的脚本示例:

for(var u = 0; u < Object.keys(freshData).length; u++) {
    tag[u].Index <-- This I want to use as a key, whenever new unique match appears
    tag[u].Value <-- This I want to add in to array of that key
} 

抱歉,非常糟糕的解释。目标只是通过唯一键创建列表,在 for 循环中找到。

【问题讨论】:

  • 您的示例脚本分配给IndexValue 属性,但您想要的输出仅包含数组?

标签: javascript arrays json indexing


【解决方案1】:

Array.prototype.reduce 救援:

const data = [
  [0, "535222325"],
  [1, "346362534"],
  [0, "534534646"],
  [1, "745354367"]
]

const groupKVPairs = (pairs, container = {}) => pairs.reduce(
  (acc, [key, value]) => {
    const group = acc[key]
    if (group !== undefined) group.push(value)
    else acc[key] = [value]
    return acc
  },
  container
)

console.log(groupKVPairs(data, []))
// output -> [["535222325", "534534646"], ["346362534", "745354367"]]

console.log(groupKVPairs(data, {}))
// output -> { "0": ["535222325", "534534646"], "1": ["346362534", "745354367"]}

console.log(groupKVPairs(data))
// output -> { "0": ["535222325", "534534646"], "1": ["346362534", "745354367"]}

【讨论】:

  • 谢谢!这让我很开心,我也终于明白了!
  • @sukkis 你想要一个数组数组还是数组对象?如果你想要一个对象,我会更新我的答案。就个人而言,在这种情况下,我更愿意返回一个数组数组。
  • 我还编辑了这个答案,把它变成了一个名为groupPairs的可重用函数。只需使用一组对随时调用它即可获得所需的结果。
  • 顺便说一句:我不是 JavaScript 实现 Array.prototype.concat 的忠实拥护者,因为它在传递数组时连接,但在传递其他任何内容时追加。即[].concat(['a']) //-&gt; ['a'] (concats),还有[].concat('a') //-&gt; ['a'] (appends)。我使用concat,但重要的是要理解这些你应该期待的不同行为,这取决于你是用数组还是用其他东西来调用它。
  • 我做了最后一个编辑。现在您可以决定是否要将结果打包到对象或数组中。如果你想要一个数组,要么用数组作为第二个参数调用函数,要么干脆不使用第二个参数。如果你想要一个对象,传入一个对象作为第二个参数。有了这个,我认为它可能非常可重用和可配置用于各种场景。
【解决方案2】:

您可以使用 Array.reduce 函数来生成所需的对象,如下所示..

var ar = [
  [0, "535222325"],
  [1, "346362534"],
  [0, "534534646"],
  [1, "745354367"]
]
var res = ar.reduce((mem, [first, last]) => ({ ...mem,
  [first]: [...mem[first] || [], last]
}), {});
console.log(res)

【讨论】:

    【解决方案3】:

    使用reduce:

    var arr = [
      [0, "535222325"],
      [1, "346362534"],
      [0, "534534646"],
      [1, "745354367"]
    ];
    
    var obj = arr.reduce((r, [key, val]) => (r[key] = (r[key]||[]).concat([val])) && r, {});
    
    console.log(obj);

    【讨论】:

    • 我想这是解决我的问题的最有效方法,感谢您的出色回答。
    • @sukkis 实际上,依赖 concat(或 ES6 扩展运算符)的解决方案将比依赖 push 的解决方案效率低,因为 concat 和扩展运算符创建一个新数组而不是而不是改变现有的。此外,如果您想在对的值部分可以是数组的对数组上使用此函数,concat 可能会给您带来意想不到的结果,因为它会使值数组变平。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2012-01-08
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多