【问题标题】:javascript remove (empty) array from assoc arrayjavascript 从 assoc 数组中删除(空)数组
【发布时间】:2018-04-24 16:56:16
【问题描述】:

我有一个 assoc js 数组,我想从中删除一个元素。 我的解决方案有效,但不是很好,有更好的解决方案吗?

// i got this assoc array
var cm = [];
    cm["a"] = ["a"];
    cm["b"] = ["c"];
    cm["s"] = ["a", "b", "c"];
    cm["x"] = [];
console.log(cm);

var searchKey = "s";
var p = ["a","c","d", "b"]; // to remove from searchKey array

// remove elements (works fine)
cm[searchKey] = cm[searchKey].filter(value => (p.includes(value) === false));
console.log(cm); // now cm[searchKey] is an empty array

// if the array at index 'searchKey' is empty remove it from assoc array
var newarray = [];
if (cm[searchKey].length===0)
{
    for(key in cm)
  {
    if (key!=searchKey) newarray[key] = cm[key];
  }
}
cm = newarray;
console.log(cm);

我尝试了过滤器和拼接,但两者都只适用于数组而不是 assoc 数组。

【问题讨论】:

  • JavaScript 没有关联数组。你误用了 JS Array 类型。
  • cm 不是关联数组。你不应该那样做——你实际上是在创建一个 array ,然后只是通过在其上设置属性来将其视为一个 object 。您应该使用 cm = {} 来实例化一个对象
  • 您似乎希望您的代码得到审查和改进,但您还没有给出什么是“好”或“更好”的代码的资格。
  • 你是对的,但是上半部分('assoc' 数组)是给定的(不要问为什么)hole 数组像一个对象一样被处理。删除作品!
  • @Sebastian 是的,delete 可以。仅仅因为你可以做某事并不意味着你应该。

标签: javascript associative-array


【解决方案1】:

你有一个对象,所以你可以这样做:

if (cm[searchKey].length===0)
{
    delete cm[searchKey]
}

【讨论】:

    【解决方案2】:

    您可能需要地图。我认为 Map 做得比您实际要求的要好。

    【讨论】:

      【解决方案3】:

      这是一个完美的地图用例:

        class Multimap extends Map {
          get(key) {
            return super.get(key) || [];
          }
      
          addTo(key, value) {
            if(this.has(key)) {
               this.get(key).push(value);
             } else {
               this.set(key, [value]);
             }
          }
      
          removeFrom(key, value) {
            this.set(key, this.get(key).filter(el => el !== value));
          }
      }
      

      这可以用作:

       const cm = new Multimap([
        ["a", ["a", "b", "c"]]
       ]);
      
       cm.removeFrom("a", "b");
       cm.get("a").includes("b") // false
      

      【讨论】:

        【解决方案4】:

        我像这样在数组上使用了.filter

        // Remove emptys
        modeSummary = modeSummary.filter(ms => ms);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-21
          • 1970-01-01
          相关资源
          最近更新 更多